• Log4Net笔记(一)基础


    最近在好好整理些小组件的使用,本文就Log4Net的使用做一个简单的说明。

    准备工作

    首先下载log4net相关资源:http://logging.apache.org/log4net/download.html

    本文中还使用了NUnit。

    log4net的组成

    log4net主要由Logger、Appender、Repository、Layout

    1)Logger

    Logger是log4net主要部分,是来产生日志消息。在log4net中提供了LogManager类来产生ILog:

    LogManager.GetLogger(LogName)

    在ILog提供了:Erro、Info、Debug、Warn四个重载方法来记录日志。

    2)Appender

    Appender是用来产生日志生成的目的地。Log4Net可以将消息生成到多个目的地,可以轻松通过配置多种Appender组件来实现,当必要的时候我们也可以通过扩张Appender来实现我们需要的截至方式。

    3)Repository

    Respository用户维护日志对象的结构。除非我们需要扩展log4net时,一般时候是不会用到Respository组件。

    4)Layout

    Layout是格式化消息输出形式的组件。Layout提供给我们了灵活而又简单消息格式化方式。

    log4net消息的级别

    级别 对应方法
    OFF  
    Fatal void Fatal(…)
    Error void Error(…)
    Warn void Warn(…)
    Info void Info(…)
    Debug void Debug(…)
    All  

    消息的级别按照上面的表格由上到下,由高到底的顺序,即OFF>Fatal>Error>Warn>Info>Debug>All。我们可以通过这样的消息的级别进行消息在Appender时进行行AppenderFiter。

    配置

    log4net的配置可以通过放在新的文件中或者放在程序的配置文件中。而log4net会通过AppDomain.CurrentDomain.BaseDirectory目录下的查找配置文件。<log4net>是log4net查找的标识。先来看我们应用程序的一个配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <log4net>
    	<appender name="LogAllToFile" type="log4net.Appender.FileAppender">
    		<file value="G:\学习资料\Log4Net\Log4NetDemo\Log4NetDemo\bin\Debug\DemoLog.log"/>
    		<appendToFile value="true"/>
    		<!--<layout type="log4net.Layout.PatternLayout">
    			<conversionPattern value="%d [%t] %-5l - %m%n%n"/>
    		</layout>-->
    		<layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    			<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" />
    		</layout>
    	</appender>
    	<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    		<param name="File" value="log/system_log_"/>
    		<param name="AppendToFile" value="true"/>
    		<param name="MaxSizeRollBackups" value="100"/>
    		<param name="MaximumFileSize" value="1KB"/>
    		<param name="StaticLogFileName" value="false"/>
    		<param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
    		<param name="RollingStyle" value="Date"/>
    		<!--<layout type="log4net.Layout.PatternLayout">
    			<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    		</layout>-->
    		<layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    			<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" />
    		</layout>
    	</appender>
    	<appender name="ConsoleAppender"
                  type="log4net.Appender.ConsoleAppender" >
    		<layout type="log4net.Layout.PatternLayout">
    			<param name="ConversionPattern"
    			   value="%d [%t] %-5p %c [%x] - %m%n"/>
    		</layout>
    	</appender>
    
    
    	<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
    		<!--BufferSize为缓冲区大小-->
    		<param name="BufferSize" value="1" />
    		<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    		<connectionString value="database=HJRightPlat;server=(local);User ID=sa;Password=123456;" />
    		<commandText value="INSERT INTO Sys_Log ([Date],[Thread],[Log_Level],[Logger],[Message],[Exception],[User],[Category],[URL],[Client_IP]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category,@URL,@ClientIp)" />
    		<parameter>
    			<parameterName value="@log_date" />
    			<dbType value="DateTime" />
    			<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="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    				<conversionPattern value="%SysMessage" />
    			</layout>
    		</parameter>
    		<parameter>
    			<parameterName value="@exception" />
    			<dbType value="String" />
    			<size value="2000" />
    			<layout type="log4net.Layout.ExceptionLayout" />
    		</parameter>
    		<parameter>
    			<parameterName value="@User" />
    			<dbType value="String" />
    			<size value="50" />
    			<layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    				<conversionPattern value="%UserName" />
    			</layout>
    		</parameter>
    		<parameter>
    			<parameterName value="@Category" />
    			<dbType value="String" />
    			<size value="50" />
    			<layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    				<conversionPattern value="%Category" />
    			</layout>
    		</parameter>
    		<parameter>
    			<parameterName value="@URL" />
    			<dbType value="String" />
    			<size value="50" />
    			<layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    				<conversionPattern value="%SysURL" />
    			</layout>
    		</parameter>
    		<parameter>
    			<parameterName value="@ClientIp" />
    			<dbType value="String" />
    			<size value="50" />
    			<layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
    				<conversionPattern value="%ClientIP" />
    			</layout>
    		</parameter>
    	</appender>
    
    
    
    	<root>
    		<priority value="ALL"/>
    		<!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
    		<appender-ref ref="LogAllToFile"/>
    		<appender-ref ref="ConsoleAppender"/>
    		<appender-ref ref="RollingLogFileAppender"/>
    		<appender-ref ref="ADONetAppender"/>
    	</root>
    </log4net>
    

    在上面的配置中我们使用了ADONetAppender、LogAllToFile、ConsoleAppender、RollingLogFileAppender四种appender,其中ADONetAppderder中我们使用了些扩展,在后面会详细进行说明。下面说说各个配置节点:

    1)Root:在Root中我们可以来指定消息级别,在上面种我们指定为“ALL”,同时我们也可以指定Appender的引用对象。

    2)Appender:我们通过Appender配置节点来指定对应的各种方式的Appender,Appender节点可以是多种的。

    应用

    首先来看我们定义了一个系统消息的实体:

        public class SysLogMessage
        {
            /// <summary>
            /// 用户名
            /// </summary>
            public string UserName
            {
                get;
                set;
            }
    
            /// <summary>
            /// 分类
            /// </summary>
            public string Category
            {
                get;
                set;
            }
    
            /// <summary>
            /// 访问的Web地址
            /// </summary>
            public string URL
            {
                get;
                set;
            }
    
            /// <summary>
            /// 客户端IP
            /// </summary>
            public string Client_IP
            {
                get;
                set;
            }
    
            /// <summary>
            /// 消息记录
            /// </summary>
            public string Message
            {
                get;
                set;
            }
        }

    用单件模式定义了一个消息的管理类:

     
        public class SysLogManager
        {
            #region Thread-safe, lazy Singleton
    
            SysLogManager() { this.InitLogManager(); }
    
            public static SysLogManager Instance {
                get {
                    return Nested.LogManager;
                }
            }
    
            private class Nested {
                static Nested() { }
                internal static readonly SysLogManager LogManager = new SysLogManager();
            }
    
            private void InitLogManager()
            {
                XmlConfigurator.Configure(BaseDataCache.log4netConfig);
                _Log = LogManager.GetLogger(LogName);
                
            }
    
            #endregion
    
            #region Help Methods And Fileds
    
            ILog _Log;
    
            string LogName = "HJRightLog";
            #endregion
    
            public void Erro(SysLogMessage msg)
            {
                _Log.Error(msg);
            }
    
            public void Erro(SysLogMessage msg, Exception e)
            {
                _Log.Error(msg, e);
            }
    
            public void Info(SysLogMessage msg)
            {
                _Log.Info(msg);
            }
    
            public void Info(SysLogMessage msg, Exception e)
            {
                _Log.Info(msg, e);
            }
    
            public void Debug(SysLogMessage msg)
            {
                _Log.Debug(msg);
            }
    
            public void Debug(SysLogMessage msg, Exception e)
            {
                _Log.Debug(msg, e);
            }
    
            public void Warn(SysLogMessage msg)
            {
                _Log.Warn(msg);
            }
    
            public void Warn(SysLogMessage msg, Exception e)
            {
                _Log.Warn(msg, e);
            }
        }

    看看测试代码:

            [Test]
            public void TestLogErro()
            {
                _logM.Erro(new SysLogMessage{
                    Message="测试",
                    UserName="Henllyee",
                    Category="Debug",
                    URL="http://henllyee.cnblogs.com"
                });
                
            }
    

    结果:

    ConsleAppender:

    image

    RollingLogFileAppender:

    image

    AdoNetAppender:

    image

    总结

    本文中概括地介绍了下log4net的使用,在下篇的文章中将会详细说明下多个常用的Appender。

  • 相关阅读:
    luogu P1451 求细胞数量
    P1443 马的遍历
    luogu P1194 买礼物
    codevs 4919 线段树练习4
    printf的实型
    printf的整型
    scanf
    printf
    c++常用函数
    字符类型C++(ascll码表)
  • 原文地址:https://www.cnblogs.com/Henllyee/p/1655206.html
Copyright © 2020-2023  润新知