log4net通过代码控制按分类输出
应用场景:
比如我们系统有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 = 100; 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里面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2017-06-28 Maven 学习笔记