簡體   English   中英

如何在Visual Studio中使用VSTO項目配置log4net

[英]How to configure log4net with VSTO project in visual studio

我試圖構建一個簡單的Outlook加載項。我在Visual Studio 2017中創建了一個VSTO項目。

通過Visual Studio創建項目時,解決方案中沒有app.configweb.config 我想為此項目使用log4net。 我應該如何配置? 我試圖為該項目添加web.config或app.config。 但是我無法從配置文件中獲取值。 我認為該項目無法識別它們。 我無法使用ConfigurationManager.AppSettings["key"]從配置文件中獲取值。

有誰知道如何在VSTO項目中使用log4net?

謝謝。

通過NuGet軟件包管理器安裝Log4Net。 然后在項目屬性中創建一個設置,例如asdf (您可以使用Log4Net部分更新app.config文件后刪除該設置),然后它將為您創建app.config

屏幕截圖

這是我在大多數項目中使用的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>

我通常創建一個名為ErrorHandler的類並添加以下代碼。

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
using log4net;
using log4net.Config;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

然后我使用以下方法寫入日志文件

    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);
        }
    }

我在GitHub上有一個項目可以作為示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM