• log4net筛选Nhibernate日志


    同样,本篇开头直接说结论:Nhibernate自带log4net记录日志,所以配置好log4net后,Nhibernate的日志会自动记录到log,但是log过于详细,查询问题不便。可以通过logger来进行Nhibernate记录日志的筛选。

    参考文档:

      1. Log4net日志使用教程-控制台、文本、数据库三种记录方式

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <!--注册log4net-->
        <configSections>
        <section name="log4net" type="log4net.Config.IgnoreSectionHandler"/>
      </configSections>
    
      <log4net>
    
        <!-- 日志默认值节点 -->
        <root>
          <!-- 默认日志对象级别 -->
          <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
          <level value="all" />
          <!-- 默认日志记录方式 ref为<appender>节点的name属性-->
          <appender-ref ref="MyColoredConsoleAppender"/>
          <!--<appender-ref ref="MyRollingFileAppender"/>-->
        </root>
        <!--
        注意!!!
        <root>节点和<logger>节点,如果同时出现,
        会先执行root的内容,再执行logger的内容,
        有可能会出现重复插入记录的情况,
        解决方案:默认节点不设置默认记录方式
        -->
        <!-- 指定类别日志设置节点 name为LogManager.GetLogger("logger.db.debug")中的name参数 -->
        <logger name="logger.db.debug">
          <!-- 该日志对象的级别(可多个级别设置在一起,公用同一个记录方式)-->
          <level value="DEBUG"/>
          <!-- 该日志对象的记录方式(可多个记录方式设置在一起,同时记录到多种媒介上) -->
          <appender-ref ref="AdoNetAppender_Debug"/>
        </logger>
        <!-- 文本日志 -->
        <logger name="logger.file.debug">
          <level value="DEBUG"/>
          <appender-ref ref="RollingFileAppender_Debug"/>
        </logger>
    
        <!-- 
        AdoNetAppender:利用ADO.NET记录到数据库的日志。
        ConsoleAppender:将日志输出到控制台。
        RollingFileAppender:将日志以回滚文件(重复操作原始文件)的形式写到文件中。
        -->
        <!-- 控制台显示日志 -->
        <appender name="MyColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
          <!-- 设置不同级别控制台显示的不同颜色 -->
          <mapping>
            <level value="INFO" />
            <foreColor value="Green" />
          </mapping>
          <mapping>
            <level value="ERROR" />
            <foreColor value="Red, HighIntensity" />
          </mapping>
          <!-- 记录的格式。 -->
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date{HH:mm:ss,fff} [%-5level] %m %n" />
          </layout>
          <!-- 
          过滤器type有如下几种类型
          log4net.Filter.DenyAllFilter        丢弃所有日志事件。
          log4net.Filter.LevelMatchFilter      准确匹配事件等级。
          log4net.Filter.LevelRangeFilter      匹配一个范围的等级。
          log4net.Filter.LoggerMatchFilter    匹配一个日志器名字的开始。
          log4net.Filter.PropertyFilter        匹配指定属性名称的子字符串。
          log4net.Filter.StringMatchFilter    匹配事件消息的子字符串。
          -->
          <filter type="log4net.Filter.LevelRangeFilter">
            <!-- 控制输出日志的级别范围 -->
            <param name="LevelMin" value="Info" />
            <param name="LevelMax" value="Error" />
          </filter>
        </appender>
    
        <!-- 文件形式记录日志-Debug -->
        <appender name="RollingFileAppender_Debug" type="log4net.Appender.RollingFileAppender">
          <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
          <param name= "File" value= "D:App_LogDebug"/>
          <!--是否是向文件中追加日志-->
          <param name= "AppendToFile" value= "true"/>
          <!--记录日志写入文件时,不锁定文本文件-->
          <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
          <!--Unicode编码-->
          <!--<Encoding value="UTF-8" />-->
          <!--最多产生的日志文件数,value="-1"为不限文件数-->
          <!--<param name="MaxSizeRollBackups" value="10" />-->
          <!--log保留天数-->
          <param name= "MaxSizeRollBackups" value= "10"/>
          <!--日志文件名是否是固定不变的(是否只写到一个文件中)-->
          <param name= "StaticLogFileName" value= "false"/>
          <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]日志文件名格式为:2008-08-31.log -->
          <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
          <!--<param name="DatePattern" value="yyyy-MM-dd/"-ReflectionLayout.log=""""  />
          <param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log""  />
          <param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log""  />-->
          <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
          <param name="RollingStyle" value="Date" />
          <!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
          <param name="maximumFileSize" value="500KB" />
          <!--记录的格式。-->
          <layout type="log4net.Layout.PatternLayout">
            <!--
            %d, %date     :表示当然的时间
          %p, %level    :表示日志的级别
          %c, %logger   :表示日志产生的主题或名称,通常是所在的类名,便于定位问题
          %m, %message  :表示日志的具体内容
          %n, %newline  :换行
            %exception    :表示异常信息
            -->
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %n" />
          </layout>
        </appender>
    
        <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质    -->
        <!-- 数据库日志-Debug(每一个appender节点,代表一个记录日志的方式)  -->
        <appender name="AdoNetAppender_Debug" type="log4net.Appender.AdoNetAppender">
          <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库 生产环境可改为10-100写入一次-->
          <bufferSize value="0" />
          <!-- 日志数据库连接类型(此处写错会导致无法写入数据库) -->
          <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <!-- 日志数据库连接字符串 -->
          <connectionString value="Server=127.0.0.1;DataBase=Test; User ID=sa;Password=sa"/>
          <!-- 日志数据库执行SQL语句 -->
          <commandText value="INSERT INTO ApplicationLog_Debug(LogDate, Level, Logger, Message, Exception)VALUES(@logdate, @loglevel, @logger, @message, @exception)"/>
          <!-- 参数-日志时间 -->
          <parameter>
            <parameterName value="@logdate" />
            <dbType value="DateTime" />
            <layout type="log4net.Layout.RawTimeStampLayout"/>
          </parameter>
          <!-- 参数-日志级别 -->
          <parameter>
            <parameterName value="@loglevel" />
            <dbType value="String" />
            <size value="200" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%p" />
            </layout>
          </parameter>
          <!-- 参数-日志名称 -->
          <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="500" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%c" />
            </layout>
          </parameter>
          <!-- 参数-日志内容(size是最大长度,超出则直接去到该长度的内容) -->
          <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%m" />
            </layout>
          </parameter>
          <!-- 参数-异常内容(Exception会记录异常的所有信息,如:System.NullReferenceException: 未将对象引用设置到对象的实例。
       在 TestLog4Net.Program.Main(String[] args) 位置 d:TestDemo_TyhTestLog4NetTestLog4NetProgram.cs:行号 41) -->
          <parameter>
            <parameterName value="@exception"/>
            <dbType value="String"/>
            <size value="4000"/>
            <layout type="log4net.Layout.ExceptionLayout"/>
          </parameter>
        </appender>
        
      </log4net>
    </configuration>
    log4net配置档
    private log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
    //GetLogger()方法的参数是寻找自定义的logger,如果没有定义,那就记到root定义的appender,该参数是conversionPattern中的%logger / %c

      2. log4net的日志输出格式-log4net.Layout.PatternLayout用法

    <!--常用log4net.Layout.PatternLayout
              %d, %date     :表示当然的时间
             %p, %level    :表示日志的级别
             %c, %logger   :表示日志产生的主题或名称,通常是所在的类名,便于定位问题
             %m, %message  :表示日志的具体内容
             %n, %newline  :换行
              %exception    :表示异常信息
              %t    :    线程
              %M   :    方法
              %class    :    类
            -->

      3. 用Log4Net记录NHibernate中执行的SQL语句及执行时间

    该博客介绍了通过设置Nhibernate内置的logger,来进行记录的筛选。

    通过上述的参考文档,即可实现Nhibernate log的筛选,下述是我的一些总结思考和问题。

    1. Nhibernate的日志记录比较详细,包括session的创建回收及Id,Transaction的开始及提交回滚,SQL的构造过程及生成的sql语句,查询结果及执行耗时,查询更新缓存等。
    2. 因此,可以根据上述选择自己想要记录的log,我们选用了NHibernate.SQL,NHibernate.Impl.SessionImpl,NHibernate.AdoNet.AbstractBatcher等logger。
    3. 因为Nhibernate记录log的class为?,method统一为【lambda_method】,所以不能直接明了的进行查询。比如多个session同时操作的情况。
    4. 针对上述的问题,目前想到的解法有根据线程ID进行区分,但是也不够明了;也可以在执行nhibernate前,手动记录log,但是该方法也只是进行了优化,并没有彻底解决查询log不便的问题。
  • 相关阅读:
    5种Python使用定时调度任务的方式
    基于Tensorflow + Opencv 实现CNN自定义图像分类
    CANN 5.0硬核技术抢先看
    大力出奇迹,揭秘昇腾CANN的AI超能力
    MSQL:超强的多任务表示学习方法
    Shell:Lite OS在线调试工具知多少
    带你掌握Vue过滤器filters及时间戳转换
    Selenium系列(六) 详细解读强制等待、隐式等待、显式等待的区别和源码解读
    Linux常用命令 top命令详解(重点)
    Selenium系列(一) 详细解读8种元素定位方式
  • 原文地址:https://www.cnblogs.com/lq67/p/11328451.html
Copyright © 2020-2023  润新知