zoukankan      html  css  js  c++  java
  • C# 开源日志框架配置

    一、NLog

    注: NLog可以将日志记录在 数据库, 文件, 控制台, 以下只记录文件日志配置

    1. WebAPI分Controller层级打印日志配置

    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Info"
        internalLogFile="./logs/nlog-internal.log">
      <!--记录日志打印日志的路径-->
      <targets async = "true">
        <target name = "file" xsi:type="File" encoding="GBK" fileName="${basedir}/${shortdate}/  ${aspnetmvc-controller}_${shortdate}.txt " layout="${date:format=HH\:mm\:ss}|${level}|threadid=${threadid}|${message}" />
      </targets>
      <rules>
        <logger name = "*" minlevel="Debug" writeTo="file" />
      </rules>
    </nlog>
    View Code

    2.WebApi中创建action和controller规则

     1 using NLog;
     2 using NLog.LayoutRenderers;
     3 namespace webAPI.Areas.HelpPage
     4 {
     5   
     6   //相当于标记,配置文件内使用,即代表用了这个规则
     7     [LayoutRenderer("aspnetmvc-controller")] 
     8     public class ControllerLayoutRenderer : LayoutRenderer
     9     {
    10         protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    11         {
    12             string controllerName = string.Empty;
    13             if (HttpContext.Current != null)
    14             {
    15                 controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
    16             }
    17             builder.Append(controllerName);
    18         }
    19     }
    20   
    21   [LayoutRenderer("aspnetmvc-action")] 
    22     public class ActionLayoutRenderer : LayoutRenderer
    23     {
    24         protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    25         {
    26             string controllerName = string.Empty;
    27             if (HttpContext.Current != null)
    28             {
    29                 controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString();
    30             }
    31             builder.Append(controllerName);
    32         }
    33     }
    34 }
    View Code

    3. 定义注册函数

    public class NLogConfig
    {
        public static void Initialize()
        {
            ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("aspnetmvc-controllers", typeof(ControllerLayoutRender));
            ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("aspnetmvc-action", typeof(ActionLayoutRender));
        }
    }
    View Code

    4. 在项目启动的时候进行注册 Global.asax.Application_Start()注册

    NLogConfig.Initiallize();

    二、Log4Net

    1.配置文件 configuration 节点中添加如下配置

    <configSections>
        <!--Log4Net配置-->
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
    <log4net>
        <!-- Define some output appenders --><!--
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
          <file value="test.txt"/>
          <appendToFile value="true"/>
          <maxSizeRollBackups value="10"/>
          <maximumFileSize value="1024KB"/>
          <rollingStyle value="Size"/>
          <staticLogFileName value="true"/>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
          </layout>
        </appender>
        <root>
          <level value="DEBUG"/>
          <appender-ref ref="RollingLogFileAppender"/>
        </root>
      </log4net>
    
    或者
    
    <log4net>
        <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
        <!-- Set root logger level to ERROR and its appenders -->
        <root>
          <level value="ERROR"/>
          <appender-ref ref="SysAppender"/>
        </root>
        <!-- Print only messages of level DEBUG or above in the packages -->
        <logger name="WebLogger">
          <level value="ERROR"/>
        </logger>
        <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
          <param name="File" value="App_Data/" />
          <param name="AppendToFile" value="true" />
          <param name="RollingStyle" value="Date" />
          <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
          <param name="StaticLogFileName" value="false" />
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
            <param name="Header" value="&#13;&#10;----------------------header--------------------------&#13;&#10;" />
            <param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" />
          </layout>
        </appender>
        <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
          </layout>
        </appender>
      </log4net>
    
    
    </configuration>
    View Code

     2. 项目启动时注册

    log4net.Config.XmlConfigurator.Configure();//读取了配置文件中关于Log4Net配置信息.

    3.调用

    ILog logger = LogManager.GetLogger("errorMsg");
    logger.Error(ex.ToString());

    4.使用案例

      4.1添加 log4net_config.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- 
        .NET application configuration file     
        This file must have the exact same name as your application with .config appended to it. 
        
        For example if your application is ConsoleApp.exe then the config file must be ConsoleApp.exe.config. 
        It must also be in the same directory as the application. 
      -->
      <!-- This section contains the log4net configuration settings -->
      <log4net>
        <!-- Define some output appenders -->
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
          <file value="rolling-log.txt" />
          <appendToFile value="true" />
          <maxSizeRollBackups value="10" />
          <maximumFileSize value="100" />
          <rollingStyle value="Size" />
          <staticLogFileName value="true" />
          <layout type="log4net.Layout.PatternLayout">
            <header value="[Header]&#13;&#10;" />
            <footer value="[Footer]&#13;&#10;" />
            <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
          </layout>
        </appender>
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
          <file value="log.txt" />
          <!-- Example using environment variables in params -->
          <!-- <file value="${TMP}\log-file.txt" /> -->
          <sppendToFile value="true" />
          <!-- An alternate output encoding can be specified -->
          <!-- <encoding value="unicodeFFFE" /> -->
          <layout type="log4net.Layout.PatternLayout">
            <geader value="[Header]&#13;&#10;" />
            <footer value="[Footer]&#13;&#10;" />
            <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
          </layout>
          <!-- Alternate layout using XML      
          <layout type="log4net.Layout.XMLLayout" /> -->
        </appender>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
          </layout>
        </appender>
        <appender name="NetSendAppender" type="log4net.Appender.NetSendAppender">
          <threshold value="ERROR" />
          <server value="SQUARE" />
          <recipient value="nicko" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
          </layout>
        </appender>
        <!-- Example of how to configure the AdoNetAppender to connect to MS Access -->
        <appender name="ADONetAppender_Access" type="log4net.Appender.AdoNetAppender">
          <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" />
          <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
          <parameter>
            <parameterName value="@log_date" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%date" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@thread" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@log_level" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%level" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%logger" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="1024" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%message" />
            </layout>
          </parameter>
        </appender>
        <!-- Example of how to configure the AdoNetAppender to connect to MS SQL Server -->
        <appender name="ADONetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
          <bufferSize value="1" />
          <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;User ID=sa;Password=sa" />
          <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
          <parameter>
            <parameterName value="@log_date" />
            <dbType value="DateTime" />
            <!-- 
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
            </layout> 
            -->
            <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>
          <parameter>
            <parameterName value="@thread" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@log_level" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%level" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%logger" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%message" />
            </layout>
          </parameter>
        </appender>
        <!-- Setup the root category, add the appenders and set the default level -->
        <root>
          <level value="ERROR" />
          <appender-ref ref="LogFileAppender" />
          <appender-ref ref="ConsoleAppender" />
        </root>
      </log4net>
    View Code

       4.2 添加操作类

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    
    namespace Common
    {
        public class LogAPI
        {
            private static readonly string LOG_DIR = "日志";
            private static readonly string LOG_FILE = LOG_DIR + "\\log" + System.DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
            private const string LOG4NET_CONFIG = "log4net_config.xml";
            private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(typeof(LogAPI));
    
            /// <summary>
            /// 静态构造函数
            /// </summary>
            static LogAPI() => Configure();
    
            /// <summary>
            /// 输出日志
            /// </summary>
            /// <param name="sInfo"></param>
            public static void Debug(string sInfo) => m_log.Error(sInfo);
    
            /// <summary>
            /// 记录debug信息
            /// </summary>
            /// <param name="e"></param>
            public static void Debug(Exception e)
            {
                Debug("Message : " + e.Message);
                Debug("Source : " + e.Source);
                Debug("StackTrace : " + e.StackTrace);
                Debug("TargetSite : " + e.TargetSite);
                if (e.InnerException != null)
                {
                    Debug(e.InnerException);
                }
            }
    
            /// <summary>
            /// 输出日志
            /// </summary>
            /// <param name="sInfo"></param>
            public static void Error(string sInfo) => m_log.Error(sInfo);
    
    
            /// <summary>
            /// 记录debug信息
            /// </summary>
            /// <param name="e"></param>
            public static void Error(Exception e)
            {
                Error("Message : " + e.Message);
                Error("Source : " + e.Source);
                Error("StackTrace : " + e.StackTrace);
                Error("TargetSite : " + e.TargetSite);
                if (e.InnerException != null)
                {
                    Error(e.InnerException);
                }
            }
    
            /// <summary>
            /// 配置log4net环境
            /// </summary>
            private static void Configure()
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    //duhj20081013调整为使用当前dll路径
                    string sPath = GetAssemblyPath();
    
                    if (!sPath.EndsWith("\\"))
                    {
                        sPath += "\\";
                    }
    
                    //查看Log文件夹是否存在,如果不存在,则创建
                    string sLogDir = sPath + LOG_DIR;
                    if (!Directory.Exists(sLogDir))
                    {
                        Directory.CreateDirectory(sLogDir);
                    }
                    string sLogFile = sPath + LOG_FILE;
                    sPath += LOG4NET_CONFIG;
                    doc.Load(@sPath);
                    XmlElement myElement = doc.DocumentElement;
    
                    //修改log.txt的路径
                    XmlNode pLogFileAppenderNode = myElement.SelectSingleNode("descendant::appender[@name='LogFileAppender']/file");
                    // Create an attribute collection from the element.
                    XmlAttributeCollection attrColl = pLogFileAppenderNode.Attributes;
                    attrColl[0].Value = sLogFile;
    
                    log4net.Config.XmlConfigurator.Configure(myElement);
                }
                catch{ }
            }
    
            /// <summary>
            /// 获取Assembly的运行路径 \\结束
            /// </summary>
            /// <returns></returns>
            public static string GetAssemblyPath()
            {
                string sCodeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
                // 8是 file:// 的长度
                sCodeBase = sCodeBase.Substring(8, sCodeBase.Length - 8);
    
                string[] arrSection = sCodeBase.Split(new char[] { '/' });
    
                string sDirPath = "";
                for (int i = 0; i < arrSection.Length - 1; i++)
                {
                    sDirPath += arrSection[i] + Path.DirectorySeparatorChar;
                }
    
                return sDirPath;
            }
        }
    }
    View Code
  • 相关阅读:
    国人常用密码TOP100 FROM THISITE
    paip.提升用户体验注册异常记录
    paip.提升用户体验与提升安全性记住密码
    paip.技术重要还是管理重要还是创意重要
    paip.软件及网站项目开发效率低下的思索与改进
    paip.接入支付接口功能流程总结
    paip.项目开发效率提升之思索
    paip.activex控件在WEB中使用流程与工具
    paip..提升安全性增加自毁功能
    paip.提升用户检验取回密码忘记密码提醒
  • 原文地址:https://www.cnblogs.com/Jason1019/p/12757818.html
Copyright © 2011-2022 走看看