应用场景:

比如我们系统有5个任务,每个任务都是独立的流程,按照传统的方式这些流程的数据会输出到一起,这无疑给我们排查问题增加了难度,因为我们需要的是每一个任务一个独立的输出文件,比如任务A输出到log/a/log.log,任务B输出到log/b/log.log。

上面提到了场景,下面说几个log4net的概念

Repository:存储库,表示一个日志记录全局对象,我们可以理解为平时使用的一个xml配置文件映射出来就是一个存储库

Logger:日志记录器,一个存储库下面有多个日志记录器,日志记录器可以通过名称来区分。

Appender:输出源,一个日志记录器可以有多个输出源(如:文件、控制台等)

下面说一下具体思路:我们如果要按照不同任务输出不同路径,理论上定义一个全局的Repository,然后里面根据不同任务定义不同的Logger,每个Logger下定义一个或多个Appender即可。但是我查看了代码,没有找到如何在Repository中定义多个Logger。因此我这边就使用了变通的办法,每一个任务定义一个Repository。

LogHelper代码如下:

public class LogHelper
{
private static object lockObj = new object();
private static Dictionary<string, ILog> diction = new Dictionary<string, ILog>(); public static ILog GetLog(string logName)
{
if (!diction.ContainsKey(logName))
{
lock (lockObj)
{
if (!diction.ContainsKey(logName))
{
var repositoryName = "rep" + logName;
var repository = LogManager.CreateRepository(repositoryName);
repository.ResetConfiguration(); //根据名称生成ILog对象
RollingFileAppender append = new RollingFileAppender();
append.Name = logName;
append.File = "logs/" + logName + "/log.log";
append.AppendToFile = true;
append.MaxSizeRollBackups = ;
append.MaximumFileSize = "5MB";
append.StaticLogFileName = false;
append.LockingModel = new FileAppender.MinimalLock();
append.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size;
string pattern = "记录时间:%date%n线程ID:[%thread] %n日志级别:%-5level%n记录位置:%location%n异常:%exception%n消息:%message%newline%n------------------------------------------%n";
PatternLayout layout = new PatternLayout(pattern);
append.Layout = layout;
append.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(repository, append); diction.Add(logName, LogManager.GetLogger(repositoryName, logName));
} }
}
return diction[logName];
}
}

使用方法:

LogHelper.GetLog("IIM").DebugFormat("请求的路径是:{0}",path);

说明:
1. append.ActivateOptions();是让当前这个appender激活,否则是不能生效的。
2. log4net.Config.BasicConfigurator.Configure(repository, append);是将append配置到repository里面

log4net通过代码控制按分类输出的更多相关文章

  1. iOS开发系列--Objective-C之协议、代码块、分类

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...

  2. Node: 如何控制子进程的输出

    大家知道,在一个node程序中,如果当前进程想要生成一个子进程,它可以调用child_process模块的spawn方法.spawn方法签名如下: child_process.spawn(comman ...

  3. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  4. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...

  5. iOS如何用代码控制以不同屏幕方向打开新页面?

    转载:http://blogread.cn/it/article/7765?f=wb#original 代码示例:https://github.com/johnlui/Swift-On-iOS/tre ...

  6. 使用XML文件和Java代码控制UI界面

    Android推荐使用XML文件设置UI界面,然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller,是模型(model)-视图(view)-控制 ...

  7. log log4net用代码记录日志

    log4net  用代码记录日志 今天在开发项目的时候,遇到跨域调用log4net中的类,出现了一个bug,提示LogImpl未标记可序列化,此时,我靠,麻烦了,这个类又不是咱们自己的,改源码我想应该 ...

  8. 【转】代码控制UI,View

    [转]Android 步步为营 第5营 代码控制UI,View   http://www.cnblogs.com/vivid-stanley/archive/2012/08/22/2651399.ht ...

  9. javascript两行代码按指定格式输出日期时间

    javascript两行代码按指定格式输出日期时间,具体看代码: function date2str(x,y) { var z ={y:x.getFullYear(),M:x.getMonth()+1 ...

随机推荐

  1. 2.Storm集群部署及单词统计案例

    1.集群部署的基本流程 2.集群部署的基础环境准备 3.Storm集群部署 4.Storm集群的进程及日志熟悉 5.Storm集群的常用操作命令 6.Storm源码下载及目录熟悉 7.Storm 单词 ...

  2. jade-render-renderFile

    var http = require('http'); var jade = require('jade'); http.createServer(function(req, res){ res.wr ...

  3. 计算广告(5)----query意图识别

    目录: 一.简介: 1.用户意图识别概念 2.用户意图识别难点 3.用户意图识别分类 4.意图识别方法: (1)基于规则 (2)基于穷举 (3)基于分类模型 二.意图识别具体做法: 1.数据集 2.数 ...

  4. linux加载字体

    将解压后的文件夹cp到/usr/share/fonts目录下,然后cd到/usr/share/fonts/ziti目录下执行:mkfontscalemkfontdirfc-cache 在linux,把 ...

  5. hive的shell用法(脑子糊涂了,对着脚本第一行是 #!/bin/sh 疯狂执行hive -f 结果报错)

    hive脚本的执行方式 hive脚本的执行方式大致有三种: hive控制台执行: hive -e "SQL"执行: hive -f SQL文件执行:参考hive用法: usage: ...

  6. 【1 封新邀请】想跟谷歌、七牛、kyligence 等大佬面对面的交流吗?

    2020 年 1 月 4 日 - 5 日,"ECUG Con 2020"大会将于杭州举行.本次大会以"ECUG For Future"为主题,围绕五大技术主题, ...

  7. 如何使用 Vue 来实现一个项目多平台打包?

    这个需求是源于我们要根据一个项目,针对某些组件(比如:日期 和 下拉组件 ) 和 页面 做终端的兼容,最终需要实现打包成2个平台:h5 和 pc  H5平台,日期组件:                ...

  8. Python+request 测试结果结合unittest生成测试报告《四》

    测试报告示例图:      目录结构介绍: 主要涉及更改的地方: 1.导入 Common.HTMLTestRunner2文件 2.run_test.py文件中新增测试报告相关的代码 具体代码实现: 1 ...

  9. java后台表单验证工具类

    /** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...

  10. ansible模块补充

    1.fetch模块, 将远程机器上的文件拉取到本地,以ip或者主机名生成目录,并保留原来的目录结构,与copy模块的功能相反. 主要参数 : dest  --  目标地址 src -- 源地址 例子 ...