在项目开发过程中,部署的服务器越来越多,查看日记的时候需要每台服务器去找日记看,这对运维人员来说是一个很不友好的方式。在此基础上就提出将所有日记统一到一台服务器上进行存放,并按照产生日记的服务器分文件夹。这时候想使用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

log4net日记文件路径动态配置的更多相关文章

  1. 使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置

    mybatis – MyBatis 3 | 入门 http://www.mybatis.org/mybatis-3/zh/getting-started.html 从 XML 中构建 SqlSessi ...

  2. winform app.config文件的动态配置

    获取 获取应用程序exe.config文件中  节点value值 /// <summary> /// 功能: 读取应用程序exe.config文件中 /// appSettings节点下 ...

  3. dive into python:模块的导入和搜索文件路径的配置

    1.Python中导入模块:import sys:相当于Java中的导入包.类. 比如,我们导入sys模块,使用:import sys; 2.Python中调用函数的时候,会从默认配置的库文件夹中(s ...

  4. log4j输出多个自定义日志文件,动态配置路径

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  5. 通过代码获取log4net的文件路径

    http://stackoverflow.com/questions/1343749/get-log4net-log-file-in-c-sharp Solution is quite easy in ...

  6. Django框架之模板路径及静态文件路径配置

    内容: (1)模板文件路径的配置 (2)静态文件路径的配置 一.模板文件路径的配置 模板文件主要通过jinja2模板进行渲染html页面,实现动态页面. 步骤一:创建一个template的文件夹,用于 ...

  7. 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置

    1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...

  8. nginx root&alias文件路径配置

    转:https://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ 总结: alias 改变了访问路径.root对应loca ...

  9. nginx root && alias 文件路径配置

    文章摘自:http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ nginx指定文件路径有两种方式root和alias ...

随机推荐

  1. docker--基本命令

    仅做学习参考,可能有误 part1:启动docker服务 在Windows上使用MySQL时候,有时无法直接使用MySQL -uroot -p 来进入MySQL,这是因为我们没有启动会MySQL服务此 ...

  2. k8s(未完待续)

    K8s简介Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展. 使用Kubernetes可以  自动化容器的部署和复制  随时扩展或收缩容器规模  将容器 ...

  3. 【转】C#中静态方法和非静态方法的区别

    源地址:https://www.cnblogs.com/amoshu/p/7477757.html 备注:静态方法不需要类的实例化就能调用,因为它是一直保存在内存中,不像非静态方法一样要放在实例化类时 ...

  4. luoguP2781 传教

    https://www.luogu.org/problemnew/show/P2781 简化版题意:有 n 个数,初始值为 0,进行 m 次操作,每次操作支持将 [l, r] 加 v 和查询 [l, ...

  5. linux系统安全及应用——系统引导和登录控制

    一.开关机安全控制 1)调整BIOS将第一引导设备设为当前系统所在硬盘 2)调整BIOS禁止从其他设备(光盘.U盘.网络)引导系统 3)调整BIOS将安全级别设为setup,并设置管理员密码 4)禁用 ...

  6. C# 动态创建实例化泛型对象,实例化新对象 new()

    普通类实现字符串创建实例: var type =Assembly.Load("SqlSugar").GetType("SqlSugar.SqlServerDb" ...

  7. 洛谷 P1546 最短网络 Agri-Net(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1546 首先不难看出这道题的思想是用了最小生成树,但是这道题有难点: 1.读题读不明白 2.不会读入 ...

  8. 【Leetcode】Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. class Solution { public ...

  9. 一个数字从后向前输入每一位数字,Camel和Pascal命名规范,IsValid()

    int num = int.Parse(Console.ReadLine()); ; ) { n = num % ; num /= ; Console.WriteLine(n); } Camel和Pa ...

  10. Android 线程+Handler的使用

    1.介绍 2.线程的使用 (1)启动 (2)执行 3.xml布局 <?xml version="1.0" encoding="utf-8"?> &l ...