C# 如何在VisualStudio中使用VSTO项目配置log4net

C# 如何在VisualStudio中使用VSTO项目配置log4net,c#,vsto,log4net,C#,Vsto,Log4net,我试图构建一个简单的outlook加载项。 我在中创建了一个VSTO项目 当项目由Visual Studio创建时,解决方案中没有app.config或web.config。我想在这个项目中使用log4net。我应该如何配置它?我试图为项目添加web.config或app.config。但我无法从配置文件中获取值。我认为项目无法识别它们。我无法使用ConfigurationManager.AppSettings[“key”]从配置文件中获取值 有人知道如何在VSTO项目中使用log4net吗 谢

我试图构建一个简单的outlook加载项。 我在中创建了一个VSTO项目


当项目由Visual Studio创建时,解决方案中没有
app.config
web.config
。我想在这个项目中使用log4net。我应该如何配置它?我试图为项目添加web.config或app.config。但我无法从配置文件中获取值。我认为项目无法识别它们。我无法使用
ConfigurationManager.AppSettings[“key”]
从配置文件中获取值

有人知道如何在VSTO项目中使用log4net吗


谢谢。

通过NuGet软件包管理器安装Log4Net。然后在项目属性中创建一个设置,如
asdf
(您可以在使用Log4Net部分更新app.config文件后删除该设置),然后它将为您创建
app.config

以下是我在大多数项目中使用的Log4Net的
app.config
配置。我用设置
asdf
创建了一个新项目,并添加了我的标准Log4Net设置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="ExcelAddIn1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    </configSections>
    <userSettings>
        <ExcelAddIn1.Properties.Settings>
            <setting name="asdf" serializeAs="String">
                <value>asdf</value>
            </setting>
        </ExcelAddIn1.Properties.Settings>
    </userSettings>
    <log4net>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline"/>
            </layout>
        </appender>
        <appender name="FileAppender" type="log4net.Appender.FileAppender">
            <file value="C:\Temp\MyOfficeAddIn.log"/>
            <appendToFile value="true"/>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date|%-5level|%message%newline"/>
            </layout>
        </appender>
        <root>
            <level value="ALL"/>
            <appender-ref ref="FileAppender"/>
        </root>
    </log4net>
</configuration>
然后我使用以下方法写入日志文件

    private static readonly ILog log = LogManager.GetLogger(typeof(ErrorHandler));

    /// <summary>
    /// Applies a new path for the log file by FileAppender name
    /// </summary>
    public static void SetLogPath()
    {
        XmlConfigurator.Configure();
        log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
        string logFileName = System.IO.Path.Combine(Properties.Settings.Default.App_PathLocalData, AssemblyInfo.Product + ".log");

        foreach (var a in h.Root.Appenders)
        {
            if (a is log4net.Appender.FileAppender)
            {
                if (a.Name.Equals("FileAppender"))
                {
                    log4net.Appender.FileAppender fa = (log4net.Appender.FileAppender)a;
                    fa.File = logFileName;
                    fa.ActivateOptions();
                }
            }
        }
    }

    /// <summary>
    /// Create a log record to track which methods are being used.
    /// </summary>
    public static void CreateLogRecord()
    {
        try
        {
            // gather context
            var sf = new System.Diagnostics.StackFrame(1);
            var caller = sf.GetMethod();
            var currentProcedure = caller.Name.Trim();

            // handle log record
            var logMessage = string.Concat(new Dictionary<string, string>
            {
                ["PROCEDURE"] = currentProcedure,
                ["USER NAME"] = Environment.UserName,
                ["MACHINE NAME"] = Environment.MachineName
            }.Select(x => $"[{x.Key}]=|{x.Value}|"));
            log.Info(logMessage);

        }
        catch (Exception ex)
        {
            ErrorHandler.DisplayMessage(ex);

        }
    }

    /// <summary> 
    /// Used to produce an error message and create a log record
    /// <example>
    /// <code lang="C#">
    /// ErrorHandler.DisplayMessage(ex);
    /// </code>
    /// </example> 
    /// </summary>
    /// <param name="ex">Represents errors that occur during application execution.</param>
    /// <param name="isSilent">Used to show a message to the user and log an error record or just log a record.</param>
    /// <remarks></remarks>
    public static void DisplayMessage(Exception ex, Boolean isSilent = false)
    {
        // gather context
        var sf = new System.Diagnostics.StackFrame(1);
        var caller = sf.GetMethod();
        var errorDescription = ex.ToString().Replace("\r\n", " "); // the carriage returns were messing up my log file
        var currentProcedure = caller.Name.Trim();
        var currentFileName = AssemblyInfo.GetCurrentFileName();

        // handle log record
        var logMessage = string.Concat(new Dictionary<string, string>
        {
            ["PROCEDURE"] = currentProcedure,
            ["USER NAME"] = Environment.UserName,
            ["MACHINE NAME"] = Environment.MachineName,
            ["FILE NAME"] = currentFileName,
            ["DESCRIPTION"] = errorDescription,
        }.Select(x => $"[{x.Key}]=|{x.Value}|"));
        log.Error(logMessage);

        // format message
        var userMessage = new StringBuilder()
            .AppendLine("Contact your system administrator. A record has been created in the log file.")
            .AppendLine("Procedure: " + currentProcedure)
            .AppendLine("Description: " + errorDescription)
            .ToString();

        // handle message
        if (isSilent == false)
        {
            MessageBox.Show(userMessage, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
private static readonly ILog log=LogManager.GetLogger(typeof(ErrorHandler));
/// 
///按FileAppender名称为日志文件应用新路径
/// 
公共静态void SetLogPath()
{
XmlConfigurator.Configure();
log4net.Repository.Hierarchy.Hierarchy h=(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
字符串logFileName=System.IO.Path.Combine(Properties.Settings.Default.App_PathLocalData,AssemblyInfo.Product+“.log”);
foreach(h.Root.Appenders中的变量a)
{
if(a是log4net.Appender.FileAppender)
{
if(a.Name.Equals(“FileAppender”))
{
log4net.Appender.FileAppender fa=(log4net.Appender.FileAppender)a;
fa.File=logFileName;
fa.激活选项();
}
}
}
}
/// 
///创建日志记录以跟踪正在使用的方法。
/// 
公共静态void CreateLogRecord()
{
尝试
{
//收集上下文
var sf=新系统。诊断。堆栈帧(1);
var caller=sf.GetMethod();
var currentProcedure=caller.Name.Trim();
//处理日志记录
var logMessage=string.Concat(新字典
{
[“程序”]=当前程序,
[“用户名”]=Environment.UserName,
[“机器名”]=Environment.MachineName
}.Select(x=>$”[{x.Key}]={x.Value}}{124;”);
日志信息(logMessage);
}
捕获(例外情况除外)
{
ErrorHandler.DisplayMessage(ex);
}
}
///  
///用于生成错误消息并创建日志记录
/// 
///
///ErrorHandler.DisplayMessage(ex);
///
/// /// ///表示在应用程序执行期间发生的错误。 ///用于向用户显示消息并记录错误记录或仅记录记录。 /// 公共静态void DisplayMessage(异常ex,布尔值isSilent=false) { //收集上下文 var sf=新系统。诊断。堆栈帧(1); var caller=sf.GetMethod(); var errorDescription=ex.ToString().Replace(“\r\n”,”);//回车符弄乱了我的日志文件 var currentProcedure=caller.Name.Trim(); var currentFileName=AssemblyInfo.GetCurrentFileName(); //处理日志记录 var logMessage=string.Concat(新字典 { [“程序”]=当前程序, [“用户名”]=Environment.UserName, [“机器名”]=Environment.MachineName, [“文件名”]=currentFileName, [“说明”]=错误说明, }.Select(x=>$”[{x.Key}]={x.Value}}{124;”); 日志错误(logMessage); //格式化消息 var userMessage=new StringBuilder() .AppendLine(“请与系统管理员联系。已在日志文件中创建记录。”) .AppendLine(“过程:”+currentProcedure) .AppendLine(“说明:”+errorDescription) .ToString(); //处理消息 if(isSilent==false) { 显示(userMessage,“意外错误”,MessageBoxButtons.OK,MessageBoxIcon.Error); } }
我在.

配置管理器中有一个项目。AppSt设置通常不与Log4NETs相关,请考虑改进您的问题。我的观点是,对于VSTO项目,我不能有Web.CONFIG或App.CONFIG。我还可以使用log4net吗?你可以在VSTO项目中使用app.config。不应该有任何东西阻止你。我现在遇到的问题是,似乎不允许我将app.config文件添加到visual studio中的VSTO项目中。在我添加了一个新的web.config文件之后,当我运行这个项目时,我会得到一个错误提示:不允许有2个配置部分。似乎VSTO项目的某个地方有一个隐藏的配置文件……为什么要为VSTO项目使用
web.config
文件?
    private static readonly ILog log = LogManager.GetLogger(typeof(ErrorHandler));

    /// <summary>
    /// Applies a new path for the log file by FileAppender name
    /// </summary>
    public static void SetLogPath()
    {
        XmlConfigurator.Configure();
        log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
        string logFileName = System.IO.Path.Combine(Properties.Settings.Default.App_PathLocalData, AssemblyInfo.Product + ".log");

        foreach (var a in h.Root.Appenders)
        {
            if (a is log4net.Appender.FileAppender)
            {
                if (a.Name.Equals("FileAppender"))
                {
                    log4net.Appender.FileAppender fa = (log4net.Appender.FileAppender)a;
                    fa.File = logFileName;
                    fa.ActivateOptions();
                }
            }
        }
    }

    /// <summary>
    /// Create a log record to track which methods are being used.
    /// </summary>
    public static void CreateLogRecord()
    {
        try
        {
            // gather context
            var sf = new System.Diagnostics.StackFrame(1);
            var caller = sf.GetMethod();
            var currentProcedure = caller.Name.Trim();

            // handle log record
            var logMessage = string.Concat(new Dictionary<string, string>
            {
                ["PROCEDURE"] = currentProcedure,
                ["USER NAME"] = Environment.UserName,
                ["MACHINE NAME"] = Environment.MachineName
            }.Select(x => $"[{x.Key}]=|{x.Value}|"));
            log.Info(logMessage);

        }
        catch (Exception ex)
        {
            ErrorHandler.DisplayMessage(ex);

        }
    }

    /// <summary> 
    /// Used to produce an error message and create a log record
    /// <example>
    /// <code lang="C#">
    /// ErrorHandler.DisplayMessage(ex);
    /// </code>
    /// </example> 
    /// </summary>
    /// <param name="ex">Represents errors that occur during application execution.</param>
    /// <param name="isSilent">Used to show a message to the user and log an error record or just log a record.</param>
    /// <remarks></remarks>
    public static void DisplayMessage(Exception ex, Boolean isSilent = false)
    {
        // gather context
        var sf = new System.Diagnostics.StackFrame(1);
        var caller = sf.GetMethod();
        var errorDescription = ex.ToString().Replace("\r\n", " "); // the carriage returns were messing up my log file
        var currentProcedure = caller.Name.Trim();
        var currentFileName = AssemblyInfo.GetCurrentFileName();

        // handle log record
        var logMessage = string.Concat(new Dictionary<string, string>
        {
            ["PROCEDURE"] = currentProcedure,
            ["USER NAME"] = Environment.UserName,
            ["MACHINE NAME"] = Environment.MachineName,
            ["FILE NAME"] = currentFileName,
            ["DESCRIPTION"] = errorDescription,
        }.Select(x => $"[{x.Key}]=|{x.Value}|"));
        log.Error(logMessage);

        // format message
        var userMessage = new StringBuilder()
            .AppendLine("Contact your system administrator. A record has been created in the log file.")
            .AppendLine("Procedure: " + currentProcedure)
            .AppendLine("Description: " + errorDescription)
            .ToString();

        // handle message
        if (isSilent == false)
        {
            MessageBox.Show(userMessage, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }