log4net日记文件路径动态配置

  在项目开发过程中,部署的服务器越来越多,查看日记的时候需要每台服务器去找日记看,这对运维人员来说是一个很不友好的方式。在此基础上就提出将所有日记统一到一台服务器上进行存放,并按照产生日记的服务器分文件夹。这时候想使用log4net就需要配置很多配置项,明显不是我们想要的。现在只能去修改log4net的源代码去满足这一要求。经过修改后的源代码在配置日记文件路径和调用创建日记对象的传入参数上做些修改就可以动态配置路径。因为没必要做太多层次的动态配置,这里只实现了2层路径的动态配置。

  1.配置文档

  

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--配置文件路径;这里修改源码,在调用LogManager.GetLogger(name)时,name结构是Client_LogType_logger-->>
      <file value="logs/%Client/%LogType/" />
      <!--是否追加到文件-->
      <appendToFile value="true" /> 
      <!--最大变换数量,-1为不限制-->
      <MaxSizeRollBackups  value="-1" />
      <!--文件大小-->
      <MaximumFileSize value="1MB"/>
      <encoding value="utf-8" />
      <!--文件以那种方式变换文件名:data日期/Size大小/Composite同时按照日期和大小-->
      <rollingStyle value="Composite" />
      <!--文件名格式-->
      <datePattern value="&quot;log_&quot;yyyyMMdd&quot;.log&quot;" />
      <!--是否为固定的文件名,理论上讲不会动态改变-->
      <StaticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date  %-5level [%thread] %newline%message%newline----------------------------------------%newline"/>
      </layout>
    </appender>
    <logger name="Test">
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </logger>

  2.调用

  

using log4net;
using System.Collections.Generic;

namespace Log4netTest
{
    public class LogHelper
    {
        //将日记对象缓存起来
        public static Dictionary<string, ILog> LogDic = new Dictionary<string, ILog>();
        static object _islock = new object();
        public static ILog GetLog(string name)
        {
            try
            {
                if (LogDic == null)
                {
                    LogDic = new Dictionary<string, ILog>();
                }
                lock (_islock)
                {
                    if (!LogDic.ContainsKey(name))
                    {
                        LogDic.Add(name, LogManager.GetLogger(name));
                    }
                }
                return LogDic[name];
            }
            catch
            {
                return LogManager.GetLogger("Default");
            }
        }

        public static void Debug(string client, string name, object message)
        {
            //该参数有三部分组成:客户端_日记类型_logger配置名称;<file value="logs/%Client/%LogType/" />
       //value如果不需要客户端时可写成<file value="logs/%LogType/" />;这里是需要动态配置的才加上
       //在上面的配置,name传入的就是 Test 最终字符串是:客户端_Debug_Test
var log = GetLog(string.Format("{0}_Debug_{1}", client, name)); if (log == null) { return; } log.Debug(message); } public static void Error(string client, string name, object message) { var log = GetLog(string.Format("{0}_Error_{1}", client, name)); if (log == null) { return; } log.Error(message); } } }

 log4net.dll

原文地址:https://www.cnblogs.com/Jimmy-pan/p/4506373.html