Log4Net 详解

article/2025/9/29 17:13:31

1.Log4Net环境的搭建与基本配置

(1)Log4Net框架介绍

    Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版。我们可以控制日志信息的输出目的地。Log4net中定义了多种日志信息输出模式。它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug。

(2)Log4Net的环境配置以及简单使用

    程序代码:

//[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"Config\log4net.config", Watch = true)]  读取其他路径的配置文件   [assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace APP02
{class Program{static void Main(string[] args){ILog log = log4net.LogManager.GetLogger("Test");log.Error("错误", new Exception("发生了一个异常"));//错误log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误log.Info("信息"); //记录一般信息log.Debug("调试信息");//记录调试信息log.Warn("警告");//记录警告信息Console.WriteLine("日志记录完毕。");Console.Read();}}
}

App.config文件配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="log4net" type="System.Configuration.IgnoreSectionHandler"/></configSections><log4net><appender name="控制台输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  /></layout></appender><logger name="Test"><level value="ALL"/><appender-ref ref="控制台输出" /></logger></log4net>
</configuration>

运行结果:

 

2.Log4Net结构

(1)Log4Net核心组件

    Log4net主要分为5个核心组件: Logger, Appender, Filter, Layout, Object Render。

(2)Logger介绍

    Logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。Logger主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。

    log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。

(3)Appender介绍

    Appender提供记录的介质,我们可能要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置。

我们可以通过Appender配置实现,而且Log4Net当中已经默认提供了一些常用的Appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。

(4)Filter介绍

    Filter就是过滤器,使用过滤器可以过滤掉Appender输出的部分内容,只输出感兴趣的日志。

(5)Layout介绍

    Layout用于控制Appender的输出格式,可以使线性的也可以使XML。一个Appender只能有一个Layout配置。

(6)Object Render介绍

    Object Render将告诉logger如何把一个对象转化为一个字符串记录到日志里。ILog中定义的记录日志的方法接收的参数是Object,而不是String。

    例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。这时logger就会知道如何把Orange记录到日志中了。

3.logger节点配置详解

(1)logger节点配置

    logger节点支持的属性:name、additivity。

        name        必须的,logger的名称,在代码中得到ILog对象时用到。

        additivity  可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。

    logger支持的子元素:level、appender-ref、param。

        level           最多一个。在这个级别或之上的才会被记录。OFF、FATAL、ERROR、WARN 、INFO、DEBUG、ALL

        appender-ref    0个或多个,要引用的appender的名字。

        param           0个或多个,设置一些参数。

(2)日志级别等级

    高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL

(3)ILog对象说明

    ILog是实现Logger的一个接口,ILog定义了5个方法(Debug,Inof,Warn,Error,Fatal)分别对不同的日志等级记录日志。这5个方法都有1个重载,以Debug为例说明一下,其它的和它差不多。

    ILog中对Debug方法的定义如下:
        void Debug(object message);

        void Debug(object message, Exception exception);

    还有一个布尔属性:
        bool IsDebugEnabled { get; }

    如果使用Debug(object message, Exception exception)则无论Layout如何配置,日志都会输出Exception信息,包括Exception的Message和Trace。如果使用Debug(object message),则无论Layout如何配置是不会输出Exception信息的。

    在代码中可以使用LogManager类来得到Logger配置下的相应的ILog对象,LogManager类用来管理所应得Logger,它的GetLogger静态方法,可以获得配置文件中相应的Logger,代码如下:

        ILog log = LogManager.GetLogger("logger-name")

(4)logger配置使用示例

    使用多个appender同事到控制台与文件中输出日志

<log4net><logger additivity="true" name="Test"><level value="ALL"/><appender-ref ref="控制台输出"/><appender-ref ref="文件输出"/></logger><appender name="控制台输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout></appender><appender name="文件输出" type="log4net.Appender.FileAppender"><param name="File" value="F:log-file.txt" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout></appender>
</log4net>

使用logger的继承机制

<log4net xmlns="urn:log4net"><logger xmlns="" name="Base"><appender-ref ref="文件输出"/></logger><logger xmlns="" name="Base.Test"><!-- 继承Base--><level value="ALL"/><appender-ref ref="控制台输出"/></logger><appender xmlns=""  name="控制台输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout></appender><appender xmlns=""  name="文件输出" type="log4net.Appender.FileAppender"><param name="File" value="F:log-file.txt" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout></appender>
</log4net>

4.appender节点配置详解

 

(1)appender节点配置

    支持的属性:name、type(name属性必须唯一,type属性必须指定)。

        name    必须的,appender对象的名称

        type    必须的,appender对象的输出类型

    常用的子元素:appender-ref、filter、layout、param

        appender-ref    0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。

        filter          0个或多个,定义此appender使用的过滤器。

        layout          最多一个。定义appender使用的输出格式。

        param           0个或多个, 设置Appender类中对应的属性的值。

(2)appender的输出方式(type属性)

    AdoNetAppender              将日志记录到数据库中。可以采用SQL和存储过程两种方式。

    AnsiColorTerminalAppender   将日志高亮输出到ANSI终端。

    AspNetTraceAppender         能用asp.net中Trace的方式查看记录的日志。

    BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。

    ConsoleAppender             将日志输出到应用程序控制台。

    EventLogAppender            将日志写到Windows Event Log。

    FileAppender                将日志输出到文件。

    ForwardingAppender          发送日志事件到子Appenders。

    LocalSyslogAppender         将日志写到local syslog service (仅用于UNIX环境下)。

    MemoryAppender              将日志存到内存缓冲区。

    NetSendAppender             将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。

    OutputDebugStringAppender   将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。

    RemoteSyslogAppender        通过UDP网络协议将日志写到Remote syslog service。

    RemotingAppender            通过.NET Remoting将日志写到远程接收端。

    RollingFileAppender         将日志以回滚文件的形式写到文件中。

    SmtpAppender                将日志写到邮件中。

    SmtpPickupDirAppender       将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。

    TelnetAppender              客户端通过Telnet来接受日志事件。

    TraceAppender               将日志写到.NET trace 系统。

    UdpAppender                 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。

(3)appender配置使用示例

    以回滚文件的形式记录日志

<appender name="文件输出" type="log4net.Appender.RollingFileAppender"><file value="F:\log\Log.txt" /><appendToFile value="true" /><rollingStyle value="Size" /><maxSizeRollBackups value="10" /><maximumFileSize value="5MB" /><staticLogFileName value="true" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout>
</appender>

使用过滤器记录日志

<appender name="控制台输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout><filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="FATAL"/></filter><filter type="log4net.Filter.DenyAllFilter" />
</appender>

5.filter节点配置详解

(1)filter节点配置

    filter只能作为<appender>的子元素,type属性表示Filter的类型。常用子元素<param>数量0个或多个,作用设置一些参数。

(2)filter的类型说明

    DenyAllFilter       阻止所有的日志事件被记录

    LevelMatchFilter    只有指定等级的日志事件才被记录

    LevelRangeFilter    日志等级在指定范围内的事件才被记录

    LoggerMatchFilter   Logger名称匹配,才记录

    PropertyFilter      消息匹配指定的属性值时才被记录

    StringMathFilter    消息匹配指定的字符串才被记录

    MdcFilter

    NdcFilter

(3)filter的工作原理

    如果想使用LevelMatchFilter过滤器过滤日志信息,我们使用如下的配置:

<appender xmlns=""  name="测试输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout><filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="FATAL"/><!--只记录等级为“FATAL”的日志信息--></filter>
</appender>

在控制台输出的日志信息如下:

此时,我们会觉得很奇怪,为什么所有等级的日志信息都输出了呢?我们再修改一下配置:

<appender xmlns=""  name="测试输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d %-5p %m %exception %n"  /></layout><filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="FATAL"/><!--只记录等级为“FATAL”的日志信息--></filter><filter type="log4net.Filter.DenyAllFilter"/><!--在最后增加这个过滤器-->
</appender>

现在,在控制台输出的日志信息如下:

 

    现在,就得到了我们想要的输出日志。其实filter的工作原理是这样的:日志在被过滤器处理时,如果日志信息满足当前过滤器的过滤条件时,该日志信息就会被输出记录,否则日志信息将被传递给下一个过滤器做同样的处理,如果下一个过滤器不存在也会输出日志信息。

(4)filter的使用示例

  记录日志等级为“FATAL”和“ERROR”的日志信息:

<filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="FATAL"/>
</filter>
<filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="ERROR"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter"/>

记录日志等级范围从“ERROR”到“INFO”的日志信息:

1 <filter type="log4net.Filter.LevelRangeFilter">
2   <levelMax value="ERROR"/>
3   <levelMin value="INFO"/>
4 </filter>
5 <filter type="log4net.Filter.DenyAllFilter"/><!--不加这个过滤器也可以-->

6.Layout节点配置详解

(1)layout节点配置

    layout节点只能作为<appender>的子元素。type属性表示Layout的类型。常用子元素<param>数量0个或多个,作用设置一些参数。

    Layout用于控制Appender的输出格式,可以使线性的也可以使XML。最常用的Layout应该是用户自定义格式的PatternLayout,其次是SimpleLayout和ExceptionLayout。然后还有4个Layout,其中有两个是输出Xml的Layout,但是中文会有问题。ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。

(2)layout节点的type属性取值

    ExceptionLayout         只呈现日志事件中异常的文本信息

    PatternLayout           可以通过类型字符串来配置的布局

    RawPropertyLayout       从日志事件中提取属性值

    RawTimeStampLayout      从日志事件中提取日期

    RawUtcTimeStampLayout   从日志事件中提取UTC日期

    SimpleLayout            很简单的布局

    XmlLayout               把日志事件格式化为XML元素的布局

(3)PatterLayout的格式化字符串

    %m、%message         输出的日志消息

    %d、%datetime        输出当前语句运行的时刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}

    %r、%timestamp       输出程序从运行到执行到当前语句时消耗的毫秒数

    %p、%level           日志的当前优先级别

    %c、%logger          当前日志对象的名称

    %L、%line            输出语句所在的行号

    %F、%file            输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能

    %a、%appdomain       引发日志事件的应用程序域的名称。

    %C、%class、%type    引发日志请求的类的全名,警告:会影响性能

    %exception           异常信息

    %u、%identity        当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能

    %l、%location        引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件

    %M、%method          发生日志请求的方法名,警告:会影响性能

    %n、%newline         换行符

    %x、%ndc             NDC(nested diagnostic context)

    %X、%mdc、%P、%properties  等介于 %property

    %property           输出{log4net:Identity=, log4net:UserName=, log4net:HostName=} 

    %t、%thread         引发日志事件的线程,如果没有线程名就使用线程号。

    %w、%username       当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能

    %utcdate            发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}

    %%                  输出一个百分号

(4)PatterLayout格式修饰符

    格式修饰符       对齐      最小宽 最大宽     说明

    %20logger       右对齐     20        无     如果logger名不足20个字符,就在左边补空格

    %-20logger      左对齐     20        无     如果logger名不足20个字符,就在右边补空格

    %.30logger      左对齐     无        30     超过30个字符将截断

    %20.30logger    右对齐     20        30     logger名要在20到30之间,少了在左边补空格,多了截断

    %-20.30logger   左对齐     20        30     logger名要在20到30之间,少了在右边补空格,多了截断

(5)layout的使用示例

1 <layout type="log4net.Layout.PatternLayout">
2   <conversionPattern value="%d [%t] %-5p %c [%x]  - %m%n"/>
3 </layout>

7.其它节点的说明与配置

(1)param节点

    <param>元素可以是如何元素的子元素,包含的属性:name、value、type。name:必须的,取值是父对象的参数名。value:可选的,value是一个能被转化为参数值的字符串。type:可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。

    param节点的主要作用是可以代替其他任何节点,例如:

<layout type="log4net.Layout.PatternLayout"><conversionPattern value="%5p %n"/><!--可以使用:<param name="ConversionPattern" value="%5p %n"/>-->
</layout>
<filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="FATAL"/><!--可以使用:<param name="LevelToMatch" value="FATAL"/>-->
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

(2)root节点

    root节点的作用是所有其它logger都默认继承它。root元素没有属性。root节点的子元素与logger一样有appender-ref、level、param。

    使用示例:

1 <root xmlns="">
2   <level value="WARN" />
3   <appender-ref ref="LogFileAppender" />
4   <appender-ref ref="ConsoleAppender" />
5 </root>

(3)log4net节点

    Log4net节点是整个日志配置的根节点,包含的属性:debug、update、threshold。debug:可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。update:可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。threshold:可选,取值是repository(库)中注册的level,默认值是ALL。

    Log4net节点支持的子元素:appender(0或多个)、logger (0或多个)、renderer (0或多个)、root(最多一个)、param(0或多个)。

(4)configSections节点

    配置log4net需要在configSections节点中加入节点section,例如:

1 <configSections>
2   <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
3 </configSections>

8.配置文件

(1)配置文件结构图

 

(2)配置文件示例

<log4net xmlns="urn:log4net"><root xmlns=""><level value="FATAL"/><appender-ref ref="控制台输出"/></root><logger xmlns="" name="Test"><level value="ALL"/><appender-ref ref="控制台输出"/></logger><logger xmlns="" name="Test.lzw" additivity="false"><level value="WARN"/><appender-ref ref="文件输出"/></logger><appender xmlns=""  name="控制台输出" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%5p %n"/></layout><filter type="log4net.Filter.LevelMatchFilter"><levelToMatch value="FATAL"/></filter><filter type="log4net.Filter.DenyAllFilter" /></appender><appender xmlns=""  name="文件输出" type="log4net.Appender.FileAppender"><file value="F:\ServerLog.txt" /><appendToFile value="false"/><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%property %n"  /></layout></appender>
</log4net>

(3)关联配置文件

    log4net默认关联的是应用程序的配置文件App.config或Web.config,可以使用程序集自定义属性来进行设置。下面来介绍一下这个自定义属性:log4net.Config.XmlConifguratorAttribute。

    XmlConfiguratorAttribute有3个属性:ConfigFile、ConfigFileExtension、Watch。

    ConfigFile:配置文件的名字,文件路径相对于应用程序目录。ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用。Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载。例如:

        //监视默认的配置文件,App.exe.config 

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

 
        //配置文件:App.exe.log4net

        [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net")]

 
        //配置文件:log4net.config

        [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

    也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
        log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:/log4net.config"));

(4)Log4j的配置文件例子

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><!--根节点的配置顺序:rendererappenderpluginloggercategoryrootloggerfactorycategoryfactory--><!-- ========================================================================================= --><!--org.apache.log4j.ConsoleAppender            控制台输出org.apache.log4j.FileAppender               文件日志输出org.apache.log4j.DailyRollingFileAppender   每个时间段产生一个日志文件org.apache.log4j.RollingFileAppender        文件大小到达指定尺寸的时候产生一个新的文件org.apache.log4j.WriterAppender             将日志信息以流格式发送到任意指定的地方org.apache.log4j.net.SMTPAppender           发邮件输出日志org.apache.log4j.net.SocketAppender         Socket日志org.apache.log4j.nt.NTEventLogAppender      Window NT日志org.apache.log4j.net.SyslogAppenderorg.apache.log4j.net.JMSAppenderorg.apache.log4j.AsyncAppenderorg.apache.log4j.varia.NullAppenderorg.apache.log4j.jdbc.JDBCAppender--><!-- ========================================================================================= --><!--控制台输出:org.apache.log4j.ConsoleAppenderThreshold=WARN          指定日志消息的输出最低层次。ImmediateFlush=true     默认值是 true,意谓着所有的消息都会被立即输出。Target=System.err       默认情况下是:System.out,指定输出控制台--><appender name="Console" class="org.apache.log4j.ConsoleAppender"><param name="Threshold" value="ALL"></param><param name="ImmediateFlush" value="true"></param><param name="Target" value="System.out"></param><layout class="org.apache.log4j.TTCCLayout" /></appender><!-- ========================================================================================= --><!--文件日志输出:org.apache.log4j.FileAppenderThreshold=WARN          指定日志消息的输出最低层次。ImmediateFlush=true     默认值是 true,意谓着所有的消息都会被立即输出。File=mylog.txt          指定消息输出到 mylog.txt 文件。Append=false            默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。--><appender name="File" class="org.apache.log4j.FileAppender"><param name="Threshold" value="ALL"></param><param name="ImmediateFlush" value="true"></param><param name="File" value="F:\\FileAppender.txt"></param><param name="Append" value="false"></param><layout class="org.apache.log4j.TTCCLayout" /></appender><!-- ========================================================================================= --><!--每个时间段产生一个日志文件:org.apache.log4j.DailyRollingFileAppenderThreshold=WARN          指定日志消息的输出最低层次。ImmediateFlush=true     默认值是 true,意谓着所有的消息都会被立即输出。File=mylog.txt          指定消息输出到 mylog.txt 文件。Append=false            默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。DatePattern=.yyyy-ww    每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:.yyyy-MM            每月.yyyy-ww            每周.yyyy-MM-dd         每天.yyyy-MM-dd-a       每天两次.yyyy-MM-dd-HH      每小时.yyyy-MM-dd-HH-mm   每分钟--><appender name="DailyRollingFile" class="org.apache.log4j.DailyRollingFileAppender"><param name="Threshold" value="ALL"></param><param name="ImmediateFlush" value="true"></param><param name="File" value="F:\\DailyRollingFileAppender.txt"></param><param name="Append" value="false"></param><param name="DatePattern" value=".yyyy-MM-dd-HH-mm"></param><layout class="org.apache.log4j.TTCCLayout" /></appender><!-- ========================================================================================= --><!--文件大小到达指定尺寸的时候产生一个新的文件:org.apache.log4j.RollingFileAppenderThreshold=WARN          指定日志消息的输出最低层次。ImmediateFlush=true     默认值是 true,意谓着所有的消息都会被立即输出。File=mylog.txt          指定消息输出到 mylog.txt 文件。Append=false            默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。MaxFileSize=100KB       后缀可以是 KB, MB  或者是  GB.  在日志文件到达该大小时,将会自动滚动,即将原来的内容移到 mylog.log.1 文件。MaxBackupIndex=2        指定可以产生的滚动文件的最大数。--><appender name="RollingFile" class="org.apache.log4j.RollingFileAppender"><param name="Threshold" value="ALL"></param><param name="ImmediateFlush" value="true"></param><param name="File" value="F:\\RollingFileAppender.txt"></param><param name="Append" value="false"></param><param name="MaxFileSize" value="1KB"></param><param name="MaxBackupIndex" value="3"></param><layout class="org.apache.log4j.TTCCLayout" /></appender><!-- ========================================================================================= --><!-- ========================================================================================= --><!--org.apache.log4j.HTMLLayout             以HTML表格形式布局org.apache.log4j.PatternLayout          可以灵活地指定布局模式org.apache.log4j.xml.XMLLayout          XML文件布局日志org.apache.log4j.SimpleLayout           包含日志信息的级别和信息字符串org.apache.log4j.TTCCLayout             包含日志产生的时间、线程、类别等等信息--><!-- ========================================================================================= --><!--以HTML表格形式布局:org.apache.log4j.HTMLLayoutLocationInfo=true       默认值是false,输出java文件名称和行号Title=日志信息          默认值是"Log4J Log Messages"--><appender name="HTML" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.HTMLLayout"><param name="LocationInfo" value="true"></param><param name="Title" value="日志信息"></param></layout></appender><!-- ========================================================================================= --><!--可以灵活地指定布局模式:org.apache.log4j.PatternLayoutConversionPattern=%m%n  指定怎样格式化指定的消息,如:%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n--><appender name="Pattern" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="级别:[%-6p] 时间:[%d{yyy-MMM-dd HH:mm:ss,SSS}] %-50l %m%n"></param></layout></appender><!-- ========================================================================================= --><!--XML文件布局日志:org.apache.log4j.xml.XMLLayoutLocationInfo=true        默认值是 false,输出 java 文件和行号--><appender name="XML" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.xml.XMLLayout"><param name="LocationInfo" value="true"></param></layout></appender><!-- ========================================================================================= --><!-- ========================================================================================= --><logger name="ConsoleLog" additivity="false"><level value="WARN" /><appender-ref ref="Console" /></logger><logger name="FileLog" additivity="false"><level value="WARN" /><appender-ref ref="File" /></logger><logger name="DailyRollingFileLog" additivity="false"><level value="WARN" /><appender-ref ref="DailyRollingFile" /></logger><logger name="RollingFileLog" additivity="false"><level value="WARN" /><appender-ref ref="RollingFile" /></logger><logger name="HTMLLog" additivity="false"><level value="WARN" /><appender-ref ref="HTML" /></logger><logger name="PatternLog" additivity="false"><level value="WARN" /><appender-ref ref="Pattern" /></logger><logger name="XMLLog" additivity="false"><level value="WARN" /><appender-ref ref="XML" /></logger><!-- ========================================================================================= --><!--优先级:ALL < DEBUG < INFO <WARN < ERROR < FATAL < OFF--><root><priority value="ALL" /><appender-ref ref="Console" /></root>
</log4j:configuration>

 


http://chatgpt.dhexx.cn/article/UjuiZfKt.shtml

相关文章

第一节:框架前期准备篇之Log4Net日志详解

一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架&#xff0c;它的功能很强大&#xff0c;可以将日志分为不同的等级&#xff0c;以不同的格式输出到不同的存储介质中&#xff0c;比如&#xff1a;数据库、txt文件、内存缓冲区、邮件、控制台、ANS…

Log4net详细教程

Log4net详细教程 一、Log4net概述log4net主要几个方法&#xff1a; 二、配置教程1、配置文件详解2、程序配置文件3、日志帮助类的编写 一、Log4net概述 log4net 是从 java 下有卓越表现的 log4j 移植过来的&#xff0c;是一个能够将日志信息输出到各种 不同目标的.net 类库&am…

Log4Net详解

Log4Net详解 零、文章目录 一、Log4Net详解 1、功能概述 &#xff08;1&#xff09;概述 Log4net库是.Net下一个非常优秀的开源日志记录组件&#xff0c;是一个帮助程序员将日志信息输出到各种目标&#xff08;控制台、文件、数据库等&#xff09;的工具。如果应用程序出现…

C#【必备技能篇】log4net的使用

使用log4net大致分以下几步&#xff1a; 1.安装 log4net&#xff0c;通过 Nuget 下载&#xff08;或者有log4net.dll的话&#xff0c;直接引用即可&#xff09; 2.新建 log4net.config 配置文件 <?xml version"1.0" encoding"utf-8" ?> <con…

Oracle存储过程的简单举例

一、建立测试数据 --建立测试数据: create table person(编号 number(10),姓名 varchar2(20),密码 varchar2(20));insert into person values(1,xzw,888);select * from person; 查询结果如下&#xff1a; 二、建立存储过程 --建立存储过程: create or replace procedure qu…

Mysql 存储过程案例教程

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 一、无参数无返回值存储过程 DELIMITER表示自定义结束符号&#xff0c;SQL一般默认&#xff1b;为结束符号 红色部分为固定格式 下面的查询语句&#xff0c;可以改成任意复杂的SQL语句 DELIMITE…

Oracle存储过程入门教程(通俗理解存储过程)

Oracle存储过程入门通俗介绍 一、118个真实应用场景的Oracle存储过程案例及开发指南二、存储过程通俗理解三、创建存储过程基本语法(汇总)四、执行存储过程的方式&#xff08;5种&#xff09;五、网上现有的创建存储过程的两种方式解释&#xff08;看注释&#xff09;六、一些存…

MySQL存储过程示例

实例1&#xff1a; 为了演示MySQL中的存储过程&#xff0c;我们先创建一些表和数据&#xff1a; drop table if exists my_test_table; create table my_test_table (id integer primary key not null AUTO_INCREMENT,name varchar(20),age integer,point double ); insert int…

mysql 存储过程详解

前言 在项目开发中&#xff0c;经常会遇到这样一种场景&#xff0c;当修改A表的一条数据时&#xff0c;需要关联修改B表、C表甚至其他更多表的数据&#xff0c;为什么会这样呢&#xff1f; 在真实的业务场景中&#xff0c;往往一张表的数据关联的业务是多样的&#xff0c;举例…

mysql存储过程call_mysql call 存储过程

PHP调用MYSQL存储过程实例 PHP调用MYSQL存储过程实例 标签&#xff1a; mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一&#xff1a;无参的存储过程$conn mysql_connect(localhost,root,root) o... 文章 thinkyoung 2016-01-20 544浏览量 存…

ORACLE存储过程

oracle存储过程 目录 oracle存储过程 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 4.案例实战 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 4.案例实战 附.参考资料 一.什…

Greenplum创建存储过程

1.美图 1.对比 greenplum 的plpgsql 注意: greenplum 的plpgsql 与 postgresql 不是完全兼容的。plpgsql 不明确界定 函数和存储过程&#xff0c;“returns void” 表示 存储过程&#xff0c;“return 数据类型” 表示 函数。greenplum中的函数分成3种类型: immutable(不可变…

Mysql 创建存储过程和函数及各种例子

Mysql 创建存储过程和函数及各种例子 1. Mysql 创建存储过程1.1 前言知识1.1.1 语法结构1.1.2 简单解释 1.2 创建存储过程入门例子1.2.1 无参存储过程1.2.1.1 不带变量1.2.1.2 带变量 1.2.2 有入参的存储过程1.2.3 有出参的存储过程1.2.4 有入参和存储的存储过程1.2.5 inout的存…

oracle 存储过程 实例 循环 给查询赋值 游标取值

CREATE OR REPLACE PROCEDURE p_updete_gs is --仅供参考 i_jdid varchar(32); i_ryid varchar(32); cursor cur is --游标 给查询赋值 select c.jdid jdid, t.ryid rybh from t_zcj_rctj t,t_zj_jd c where t.ryidc.rybh and t.bgzt<>3 and c.bgzt<>…

SQL存储过程实例详解

SQL存储过程实例详解 本文用3个题目&#xff0c;从建立数据库到创建存储过程&#xff0c;详细讲解数据库的功能。 题目1 学校图书馆借书信息管理系统建立三个表&#xff1a; 学生信息表&#xff1a;student 字段名称 数据类型 说明 stuID char(10) 学生编号&#xff0c;主…

oracle存储过程实例

认识存储过程和函数 存储过程和函数也是一种PL/SQL块&#xff0c;是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序&#xff0c;我们通常把PL/SQL程序称为无名块&#xff0c;而存储过程和函数是以命名的方式存储于数据库中的。和PL/SQL程序相比&#xff…

MySQL存储过程实例

1、简单实例 create procedure demo.p_test1() begin-- 使用 declare语句声明一个变量declare id int default 0;declare name varchar(50) default ;-- 使用set语句给变量赋值set id7521;-- 将users表中id1的名称赋值给usernameselect ename into name from demo.emp where e…

存储过程详解与实例

存储过程 1、存储过程的优缺点 优点 通过把处理封装在容易使用的单元中&#xff0c;简化复杂的操作&#xff1b;简化对变动的管理&#xff1b;通常存储过程有助于提高应用程序的性能&#xff1b;存储过程有助于减少应用程序和数据库服务器之间的流量&#xff0c;因为应用程序…

数据库存储过程讲解与实例

目录 1 存储过程简介 2 存储过程使用 2.1 创建存储过程 2.2 in&#xff0c;out以及inout 1 存储过程简介 SQL语句需要先编译然后执行&#xff0c;而存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中…

【数据库】ACID底层实现原理

前言 我们在学MySQL的时候事务是必须要知道的部分&#xff0c;也就是原子性(Atomic)、一致性(Consistency)、隔离性(isolation)和持久性(Persistence)。知道他的概念其实是远远不够的&#xff0c;现在越来越卷&#xff0c;那么就必须知道的他的原理什么&#xff1f;怎么是实现…