common.logging是基于java语言的一个日志门面框架,是Apache基金会下的commons项目下的一个子项目,让你的日志脱离具体的实现。
Commong.Logging是.NET下的日志门面框架,它是基于C#语言的移植。并且做了一些基于Windows的扩展。比如ETW(Windows事件跟踪)等独特的日志记录和收集方式。关于如何收集ETW可以参考https://www.cnblogs.com/artech/p/logging-via-etw.html 。
今天主要讲讲MultipleLogger的配置,首先我们使用nuget安装相关的软件包,最开始的时候我是自己尝试,一直没有配置正确,后来在源码的tests目录下,找到了单元测试的配置文件才搞明白。
App.config见下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><sectionGroup name="common"><section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/><section name="logging.multipleLoggers" type="Common.Logging.MultipleLogger.ConfigurationSectionHandler, Common.Logging.MultipleLogger"/></sectionGroup><section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" /><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><common><logging><factoryAdapter type="Common.Logging.MultipleLogger.MultiLoggerFactoryAdapter, Common.Logging.MultipleLogger"><arg key="MeaninglessKey" value="MeaninglessValue"/></factoryAdapter></logging><logging.multipleLoggers><factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1215"><!--FILEFILE-WATCHINLINEEXTERNAL--><!----><!--<arg key="configType" value="INLINE" />--><arg key="configType" value="FILE-WATCH" /><arg key="configFile" value="~/log4net.config" /><!--log4net使用独立的配置文件--></factoryAdapter><factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog4412"><arg key="configType" value="FILE" /><arg key="configFile" value="~/NLog.config" /></factoryAdapter><factoryAdapter type="Common.Logging.ETW.ETWLoggerFactoryAdapter,Common.Logging.ETWLogger"><arg key="level" value="DEBUG"/><!--<arg key="commonLoggingEventSourceType" value="Common.Logging.ETW.CommonLoggingEventSource,Common.Logging.ETWLogger"/>--><arg key="permitDuplicateEventSourceRegistration" value="false"/></factoryAdapter></logging.multipleLoggers></common><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /></startup>
</configuration>

在配置Section时,除了标准的loggin外,记得把Multe的处理节点也要配置上,如下:

<section name="logging.multipleLoggers" type="Common.Logging.MultipleLogger.ConfigurationSectionHandler, Common.Logging.MultipleLogger"/>

记住,这两个一个都不要少。
然后配置一个log4net.config配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<log4net><!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" /></layout></appender>--><appender name="InfoRollingLogFileAppender" type="log4net.Appender.RollingFileAppender, log4net"><param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /><param name="File" value="logs/" /><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="'Info-'yyyy-MM-dd.'log'" /><param name="AppendToFile" value="true" /><param name="MaxSizeRollBackups" value="10" /><param name="MaximumFileSize" value="5MB" /><param name="RollingStyle" value="Date" /><!--Size ==- Date--><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /></layout><filter type="log4net.Filter.LevelRangeFilter"><levelMin value="DEBUG"/><levelMax value="WARN"/></filter></appender><appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender, log4net"><param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /><param name="File" value="logs/" /><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="'Error-'yyyy-MM-dd.'log'" /><param name="AppendToFile" value="true" /><param name="MaxSizeRollBackups" value="10" /><param name="MaximumFileSize" value="5MB" /><param name="RollingStyle" value="Date" /><!--Size ==- Date--><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /></layout><filter type="log4net.Filter.LevelRangeFilter"><levelMin value="ERROR"/><levelMax value="FATAL"/></filter></appender><appender name="DefaultRollingLogFileAppender" type="log4net.Appender.RollingFileAppender, log4net"><param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /><param name="File" value="logs/" /><!--文件保存的路径--><param name="StaticLogFileName" value="false" /><!--文件名动态生成--><param name="DatePattern" value="'Default-'yyyy-MM-dd.'log'" /><!--文件名命名规则--><param name="AppendToFile" value="true" /><param name="MaxSizeRollBackups" value="10" /><param name="MaximumFileSize" value="5MB" /><!--文件超过5M将创建新文件--><param name="RollingStyle" value="Date" /><!--Size ==- Date--><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /><!--日志内容格式--></layout><filter type="log4net.Filter.LevelRangeFilter"><!--日志级别过滤器:此附加器只附加指定级别的日志--><levelMin value="DEBUG"/><levelMax value="FATAL"/></filter></appender><root><level value="ALL" /><appender-ref ref="RollingLogFileAppender" /><appender-ref ref="InfoRollingLogFileAppender" /></root><logger name="MyApp.DataAccessLayer"><level value="DEBUG" /></logger><!-- ALL DEBUG INFO WARN ERROR FATAL OFF [DEBUG < INFO < WARN < ERROR < FATAL] 大范围 到 小范围--><logger name="LogDemoWeb._Default" debug="false"><level value="ALL" /><appender-ref ref="DefaultRollingLogFileAppender" /></logger>
</log4net>

再来一个NLog的配置文件NLog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="false"internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"><variable name="variable1" value="${newline}date:    ${date}${newline}level:    ${level}${newline}logger:    ${logger}${newline}machinename:    ${machinename}
${newline}message:    ${message}${newline}appdomain:    ${appdomain}${newline}assembly-version:    ${assembly-version}${newline}basedir:    ${basedir}
${newline}callsite:    ${callsite}${newline}callsite-linenumber:    ${callsite-linenumber}${newline}counter:    ${counter}${newline}nlogdir:    ${nlogdir}
${newline}processid:    ${processid}${newline}processname:    ${processname}${newline}specialfolder:    ${specialfolder}
${newline}stacktrace: ${stacktrace}${newline}-----------------------------------------------------------" /><targets><target name="log_file" xsi:type="File" fileName="${basedir}/LogInformation/${level}_${shortdate}.txt" layout="${variable1}" /></targets><rules><logger name="*"   writeTo="log_file" /></rules>
</nlog> 

虽然这个多日志输出的Adapter作用不大,但我们也不得不佩服这些开源人的想法。

【C#】【Log】Common.Logging.MultipleLogger及ETWLoggerd研究相关推荐

  1. common.logging和log4j比较

    apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现 log4j是具体的日 ...

  2. C# 日志管理框架:Common.Logging和log4net

    01 - DLL引用 ‍common logging是一个通用日志接口框架,log4net是一个强大的具体实现框架. common logging可以把输出连接到其他非log类上, 如EntLib的日 ...

  3. python 日志输出变量_python中记录打印的log模块logging的用法实例

    日志基础教程 日志是对软件执行时所发生事件的一种追踪方式.软件开发人员对他们的代码添加日志调用,借此来指示某事件的发生.一个事件通过一些包含变量数据的描述信息来描述(比如:每个事件发生时的数据都是不同 ...

  4. 算法日志:python把终端的信息存为log和logging

    python 把终端的信息存为log import sys import time class Logger(object):def __init__(self, filename='default. ...

  5. an error has occurred while trying to access the log file. logging may not function properly

    I had this issure a couple of days ago  when  open my vs2012 on windows8,by google i find the soluth ...

  6. Boost研究:Boost Log

    日志系统用于记录软件运行过程中的关键信息,是大型CAx软件系统的一个重要的组件. 本文拟对Boost.Log模块进行分析,旨在记录其技术要点. 注1:限于笔者研究水平,难免有理解不当,欢迎批评指正. ...

  7. 【log4j】—日志记录log4j的Logger和commons.logging的Log的区别

    1.做日志的时候一般是两者一起用,commons-logging工作原理做接口,log4j做实现,应用起来比单独的使用log4j要简单. commons-logging工作原理: 1.1 首先在cla ...

  8. python调用微信客户端_python模拟微信客户端打开链接Python Logging 模块研究

    背景 在一个新的项目里面加入了日志功能,想自己写一个,但是一个偶然的机会,通过google发现Python内建了一个非常强大的日志(log)模块:logging.粗略的研究了一下,下面是我的一些心得札 ...

  9. tornado中log使用与logging模块的关联影响详解

    目录 [问题总结及代码] 参考一:参考点:logging基础内容了解 参考二:参考点:tornado.log 的 配置设置.日志自动分割.自定义格式化输出日志 参考三:参考点:自定义日志输出.日志分割 ...

最新文章

  1. Centos7上安装oracle11g/12c的安装教程推荐及注意事项
  2. android万年历有什么作用,基于android的万年历农历怎么算
  3. linux下用户的添加
  4. wasm逆向——(极客大挑战2021wasm
  5. 数字化转型的研究方向
  6. 就是把努力涂抹在人生的画卷上
  7. 善待精力,保持体力,保持热情
  8. nginx教程全集汇总(ttlsa出品)
  9. vue2.0 如何自定义组件(vue组件的封装)
  10. Derangement(AtCoder-3525)
  11. 关于垂直切分Vertical Sharding的粒度
  12. secucrecrt配置文件导入和保存
  13. 论如何使用zabbix监控LNMP架构
  14. 如何进行筛选数组(源码解析)
  15. ImportError: No module named ‘keras_contrib‘
  16. JAVA项目之房屋出租系统
  17. 本地文件怎么传到linux服务器,本地文件传到linux服务器
  18. 古人说的雅事,通常是做什么?
  19. mysql 加号_从数据库中读取字符串时其中的空格变成加号
  20. (转)在 Linux 平台中调试 C/C++ 内存泄漏方法

热门文章

  1. 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
  2. 从空军机长到大厂程序员,关系数据库之父传奇
  3. LeetCode 滑动窗口(Sliding Window)类问题总结
  4. HOG特征过程解释(转)
  5. Wireshark默认不抓取本地包的解决方式
  6. ATP - UI 自动化测试用例管理平台搭建
  7. Java程序猿笔记——基于redis分布式锁实现“秒杀”
  8. Flink在美团的实践与应用
  9. toString,toLocaleString,valueOf的不同
  10. pytorch读取文本训练