• .net 项目如何添加log4net日志记录


    1、在项目根目录新建文件log4net.config,此文件中的节点解释还请自动百度。

    文件实例:

    <?xml version="1.0"?>
    <configuration>
    <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    </configSections>
    <!--日志-->
    <log4net>
    <logger name="logerror">
    <level value="ERROR" />
    <appender-ref ref="ErrorAppender" />
    </logger>
    <logger name="loginfo">
    <level value="INFO" />
    <appender-ref ref="InfoAppender" />
    </logger>
    <logger name="logdata">
    <level value="All" />
    <appender-ref ref="DataBaseAppender" />
    </logger>


    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
    <file value="logsError" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMddHH&quot;.log&quot;" />
    <staticLogFileName value="false" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
    </layout>
    </appender>
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
    <file value="logsInfo" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMddHH&quot;.log&quot;" />
    <staticLogFileName value="false" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
    </layout>
    </appender>

    <!--定义输出到数据库-->
    <appender name="DataBaseAppender" type="log4net.Appender.AdoNetAppender">
    <!--日志缓存写入条数-->
    <bufferSize value="0" />
    <!--日志数据库连接串-->
    <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <connectionString value="Server=192.168.250.38;Port=3307;Database=datashar; User=root;Password=pass@word1;Charset=utf8mb4;SslMode=None" />
    <!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.30319.33440, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="Server=.;Database=Test; User=sa;Password=123;" />-->
    <!--日志数据库脚本-->
    <commandText value="INSERT INTO datashare_operatelog (ID,TableName,ColumnName,OldValue,NewValue,OperateType,OperateTime,OperateUserID,OperateUserName) VALUES (@ID,@TableName,@ColumnName,@OldValue,@NewValue,@OperateType,@OperateTime,@OperateUserID,@OperateUserName)" />
    <!--主键ID-->
    <parameter>
    <parameterName value="@ID" />
    <dbType value="String" />
    <size value="36" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{ID}" />
    </layout>
    </parameter>
    <!--表名TableName -->
    <parameter>
    <parameterName value="@TableName" />
    <dbType value="String" />
    <size value="255" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{TableName}" />
    </layout>
    </parameter>
    <!--列名ColumnName -->
    <parameter>
    <parameterName value="@ColumnName" />
    <dbType value="String" />
    <size value="255" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{ColumnName}" />
    </layout>
    </parameter>
    <!--旧值 OldValue -->
    <parameter>
    <parameterName value="@OldValue" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{OldValue}" />
    </layout>
    </parameter>
    <!--新值 NewValue -->
    <parameter>
    <parameterName value="@NewValue" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{NewValue}" />
    </layout>
    </parameter>
    <!--操作类型OperateType -->
    <parameter>
    <parameterName value="@OperateType" />
    <dbType value="String" />
    <size value="255" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{OperateType}" />
    </layout>
    </parameter>
    <!--操作时间OperateTime -->
    <parameter>
    <parameterName value="@OperateTime" />
    <dbType value="DateTime" />
    <size value="6" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{OperateTime}" />
    </layout>
    </parameter>
    <!--操作人ID OperateUserID -->
    <parameter>
    <parameterName value="@OperateUserID" />
    <dbType value="String" />
    <size value="36" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{OperateUserID}" />
    </layout>
    </parameter>
    <!--操作人姓名OperateUserName -->
    <parameter>
    <parameterName value="@OperateUserName" />
    <dbType value="String" />
    <size value="255" />
    <layout type="OD_FrameWork.Common.Helper.MyLayout">
    <conversionPattern value="%property{OperateUserName}" />
    </layout>
    </parameter>
    </appender>

    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
    <!--发布时建议修改成 ERROR-->
    <level value="ALL" />
    <appender-ref ref="DataBaseAppender" />
    </root>
    </log4net>
    </configuration>

    2、找到项目的配置文件(App.config或者Web.config)添加以下代码

    <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </sectionGroup>
    </configSections>
    <log4net configSource="log4net.config" />

    3、引用log4net.dll,如果没有可以通过nuget添加。

    4、找到项目中的AssemblyInfo.cs文件  添加以下代码

    //[assembly: log4net.Config.XmlConfigurator(Watch = true)]
    //注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

    5、如果是CS程序,在根目录的Program.cs中的Main方法中添加:

    如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:

    添加以下代码

    log4net.Config.XmlConfigurator.Configure();
    var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
    XmlConfigurator.ConfigureAndWatch(logCfg);
    LogHelper.SetConfig(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

    6、新建一个文件LogHelper.cs,里面的代码如下:

    public class LogHelper
    {
    //log4net日志专用
    public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
    public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
    public static readonly log4net.ILog logedata = log4net.LogManager.GetLogger("logdata");

    public static void SetConfig()
    {
    log4net.Config.XmlConfigurator.Configure();
    }

    /// <summary>
    /// 设置log4net配置文件路径
    /// </summary>
    /// <param name="configFile">log4net配置文件路径</param>
    public static void SetConfig(FileInfo configFile)
    {
    log4net.Config.XmlConfigurator.Configure(configFile);
    }
    /// <summary>
    /// 普通的文件记录日志
    /// </summary>
    /// <param name="info"></param>
    public static void WriteLog(string info)
    {
    loginfo.Info(" " + info + " ");
    }
    /// <summary>
    /// 错误日志
    /// </summary>
    /// <param name="info"></param>
    /// <param name="se"></param>
    public static void WriteLog(string info, Exception ex)
    {
    logerror.Error(" " + info + " ", ex);
    }

    /// <summary>
    /// 数据库日志
    /// </summary>
    /// <param name="Id">GUID</param>
    /// <param name="tableName">表名称</param>
    /// <param name="columnName">列名(可为空)</param>
    /// <param name="oldValue">旧记录的Json字符串</param>
    /// <param name="newValue">新纪录的 Json字符串</param>
    /// <param name="operateType">操作类型(Update,Insert,Delete)</param>
    /// <param name="operateTime">操作时间</param>
    /// <param name="operateUserID">操作人ID</param>
    /// <param name="operateUserName">操作人姓名</param>
    public static void WriteLog(string Id, string tableName, string columnName, string oldValue, string newValue, string operateType, DateTime? operateTime, string operateUserID, string operateUserName)
    {
    bool d = logedata.IsInfoEnabled;
    logedata.Info(new LogContent(Id, tableName, columnName, oldValue, newValue, operateType, operateTime, operateUserID, operateUserName));
    }
    }

    7、新建文件LogContent.cs(这个文件主要为了写日志到数据库的),代码如下:

    public class LogContent : IRequiresSessionState
    {
    public LogContent()
    {

    }

    public LogContent(string Id, string tableName, string columnName, string oldValue, string newValue, string operateType, DateTime? operateTime, string operateUserID, string operateUserName)
    {
    ID = Id;
    TableName = tableName;
    ColumnName = columnName;
    OldValue = oldValue;
    NewValue = newValue;
    OperateType = operateType;
    OperateTime = operateTime;
    OperateUserID = operateUserID;
    OperateUserName = operateUserName;
    }


    /// <summary>
    /// 主键ID
    /// </summary>
    public System.String ID { get; set; }

    /// <summary>
    /// 表名称
    /// </summary>
    public System.String TableName { get; set; }

    /// <summary>
    /// 列名
    /// </summary>
    public System.String ColumnName { get; set; }

    /// <summary>
    /// 旧值
    /// </summary>
    public System.String OldValue { get; set; }

    /// <summary>
    /// 新值
    /// </summary>
    public System.String NewValue { get; set; }

    /// <summary>
    /// 操作类型
    /// </summary>
    public System.String OperateType { get; set; }

    /// <summary>
    /// 操作时间
    /// </summary>
    public System.DateTime? OperateTime { get; set; }

    /// <summary>
    /// 操作人ID
    /// </summary>
    public System.String OperateUserID { get; set; }

    /// <summary>
    /// 操作人姓名
    /// </summary>
    public System.String OperateUserName { get; set; }
    }

    public class MyLayout : PatternLayout
    {
    public MyLayout()
    {
    this.AddConverter("property", typeof(LogInfoPatternConverter));
    }
    }

    public class LogInfoPatternConverter : PatternLayoutConverter
    {

    protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    {
    if (Option != null)
    {
    // Write the value for the specified key
    WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
    }
    else
    {
    // Write all the key value pairs
    WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
    }
    }
    /// <summary>
    /// 通过反射获取传入的日志对象的某个属性的值
    /// </summary>
    /// <param name="property"></param>
    /// <returns></returns>

    private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
    {
    object propertyValue = string.Empty;
    PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
    if (propertyInfo != null)
    propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
    return propertyValue;
    }
    }

    8、上面7步完成之后就可以轻松愉快的调用写日志的方法了!

    info:LogHelper.WriteLog("ListenStatus,DateTime:" + dateTime.ToString("yyyyMMddHHmmss"));

    Error:LogHelper.WriteLog("ListenStatus,DateTime:" + dateTime.ToString("yyyyMMddHHmmss"),ex);

    注意:log4net.config的属性设置:

  • 相关阅读:
    Spark学习进度1——Scala安装
    Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
    Spark学习进度2——Scala基础
    自我成长
    node服务容器 serve 和 httpserve
    TS中接口
    js计算当前时间差
    【转载】 centos7.0 安装字体库
    Python 二进制 雪花算法
    Django 重新生成表结构
  • 原文地址:https://www.cnblogs.com/niuniu0108/p/11149841.html
Copyright © 2020-2023  润新知