最近接了个活,winform的帮人做几个页面,这里就以winform项目为例了,之前log4net都是项目中继承好了的,这次自己研究从0到1搭建了一个,发现其实也蛮简单的,主要分为以下三步和一个注意事项。

第一步

nuget上拉去log4net,或者从别的项目中引用一下(就是把log4net的包拖过来),这个很简单就略过了。

第二步

配置log4net的config文件,这里网上主要有两种方式

一种是自己再添加一个log4net.config(这种我不推荐,太麻烦了,建议使用第二种)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 1. 添加 log4net 配置的节点声明代码-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler"/>
</configSections> <!--2. log4net 配置的核心代码-->
<log4net>
<!--日志输出级别-->
<root>
<level value="ALL"/>
<appender-ref ref="DebugLogFileAppender"/>
<appender-ref ref="ErrorLogFileAppender"/>
<appender-ref ref="ConsoleAppender"/>
</root> <!--调试日志输出-->
<appender name="DebugLogFileAppender"
type="log4net.Appender.RollingFileAppender">
<StaticLogFileName value="false"/> <!--动态生成文件名-->
<file value="Logs\Log4NetDemo_"/> <!--文件名(带路径)的固定部分-->
<DatePattern value="yyyy-MM-dd'.log'"/> <!--文件名(带路径)的动态部分-->
<Encoding value="utf-8"/> <!--文件编码-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> <!--使用最小锁定模型,以允许多个进程可以写入同一个文件 -->
<appendToFile value="true"/> <!--内容是否追加到文件末尾(如果为 False 则覆盖)-->
<RollingStyle value="Composite"/>
<MaximumFileSize value="10MB"/> <!--单个文件最大大小-->
<MaxSizeRollBackups value="10"/> <!--备份文件的个数(保留10个最近的日志,会循环覆盖)-->
<layout type="log4net.Layout.PatternLayout"> <!--输出格式-->
<ConversionPattern value="Level: %-5p
%nThread ID: %t
%nTime: %d
%nClass: %c
%nFile: %F Line: %L
%nMessage: %m
%n%exception
%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="FATAL" />
</filter>
</appender> <!--错误日志输出-->
<appender name="ErrorLogFileAppender"
type="log4net.Appender.RollingFileAppender">
<StaticLogFileName value="false"/> <!--动态生成文件名-->
<file value="Logs\Error Logs\Log4NetDemo_Error_"/> <!--文件名(带路径)的固定部分-->
<DatePattern value="yyyy-MM-dd'.log'"/> <!--文件名(带路径)的动态部分-->
<Encoding value="utf-8"/> <!--文件编码-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> <!--使用最小锁定模型,以允许多个进程可以写入同一个文件 -->
<appendToFile value="true"/> <!--内容是否追加到文件末尾(如果为 False 则覆盖)-->
<RollingStyle value="Composite"/>
<MaximumFileSize value="10MB"/> <!--单个文件最大大小-->
<MaxSizeRollBackups value="10"/> <!--备份文件的个数(保留10个最近的日志,会循环覆盖)-->
<layout type="log4net.Layout.PatternLayout"> <!--输出格式-->
<ConversionPattern value="Level: %-5p
%nThread ID: %t
%nTime: %d
%nClass: %c
%nFile: %F Line: %L
%nMessage: %m
%n%exception
%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender> <!--控制台输出-->
<appender name="ConsoleAppender"
type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR"/>
<foreColor value ="white"/>
<backColor value ="Red,HighIntensity"/>
</mapping>
<mapping>
<level value="DEBUG"/>
<backColor value ="Green"/>
</mapping>
<layout type="log4net.Layout.PatternLayout">
<ConversionPattern value="Log Level: %-5level%n%date thread[%t] %c%nMessage: %m%n%exception%n"/>
</layout>
</appender> </log4net>
</configuration>

第二种就是我自己用的直接写在项目的config文件里:

不过这里有一个细节要注意:

就是log4net的节点必须放在第一个!!!

就是log4net的节点必须放在第一个!!!

就是log4net的节点必须放在第一个!!!

这里startup放最上面是会报错的:

config文件(这个文件网上有很多,根据自己所需要的格式网上随便拉一个即可):

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections> <connectionStrings />
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="RollingLogFileAppender_DateFormat" />
</root> <logger name="MyLogger.Logging"> <level value="DEBUG" />
</logger> <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<file value="Log\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
<staticLogFileName value="false" />
<param name="MaxSizeRollBackups" value="100" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n所在类:%logger property: [%property{NDC}] - %n描述信息:%message%newline %n" />
</layout>
</appender>
</log4net> </configuration>

第三步

在program.cs(就是应用程序启动的入口函数,如果是asp.net程序就是startup类,更高版本的没有startup类的自己找一下入口函数即可)中加入:

log4net.Config.XmlConfigurator.Configure();

然后再需要打日志的类上面加入(这是我的测试demo,正式开发别写这,否则肯定会被同事喷脑残):

最后如果你是按照我第二种方式操作的,在你bin的debug下应该会多一个log文件夹。

至此,完工,全程两分钟搞完(网上有些其他教程要配AssemblyInfo.cs和搞什么package.config的如果你是从nuget上拉的不需要管这些!如果你是从本地或者其他项目考的不管这些也能正常运行!亲测。。。)

第二步的第一种方法参考自: https://www.cnblogs.com/dhqy/p/13820600.html

log4net两分钟三步急速搭建日志框架教程(注意System.Configuration.ConfigurationErrorsException: 配置系统未能初始化 ---> System.Configuration.ConfigurationErrorsException: )的更多相关文章

  1. 【运维技术】redis(一主两从三哨兵模式搭建)记录

    redis(一主两从三哨兵模式搭建)记录 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也包含我自己,能够节省对应的时间. 软件架构: 生产环境使用三台 ...

  2. 三步快速搭建Typora图床(SM.MS+PicGo)

    三步快速搭建Typora图床(基于SM.MS+PicGo) 前言 在有些同学使用Typora的过程中,会发现Typora不像Word一样,在文档脱离本机后依然正常显示图片,自己的tyopora文件在发 ...

  3. redis(一主两从三哨兵模式搭建)记录

    转自:http://www.cnblogs.com/fly-piglet/p/9836314.html 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也 ...

  4. ABP架构学习系列三:手工搭建ABP框架

    由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢 ...

  5. 第三步:搭建JAVA项目

    创建一个JAVA项目,如图: 然后给项目起一个名字,直接点击完成. 下载lucene包解压后放到JDK安装后的lib文件夹里,如图: 首先要导入lucene包,对准项目名右击>构建路径>配 ...

  6. Java日志框架-Logback手册中文版以及官方配置文档教程

    Logback手册中文版:(链接: https://pan.baidu.com/s/1bpMyasR 密码: 6u5c),虽然版本有点旧,但是大体意思差不多,先用中文版了解个大概,然后一切最新的配置以 ...

  7. 实践 - 搭建Redis一主两从三哨兵

    实践 - 搭建Redis一主两从三哨兵 原因: 最近在复习Redis的时候,学习到了为了提高Redis集群的高可用性,有一个模式为哨兵模式.哨兵模式的作用是为了在主节点出现阻塞或者错误,无法接收数据的 ...

  8. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

  9. 三、Spring Boot 日志

    1.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...

  10. 后端——框架——日志框架——logback——《官网》阅读笔记——第一章节

    第一章节搭建了logback日志框架的环境,演示了Hello World的示例,并详细分析了示例. 搭建日志框架的过程非常简单,只需要在项目的classpath上添加以下三个jar包,logback- ...

随机推荐

  1. angular Ionic CLI连接数据获取数据无限滚动

  2. SpringCloud————>了解什么是微服务技术

    SpringCloud是Spring为微服务架构思想做的一个一站式实现.从某种程度是可以简单的理解为,微服务是一个概念.一个项目开发的架构思想.SpringCloud是微服务架构的一种java实现. ...

  3. Salesforce LWC学习(四十一) If:true 即将弃用?

    本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_dir ...

  4. linux 基础(6)简单认识 bash

    shell 和 bash 是什么? shell 是一种应用程序,在这个程序里输入文字指令,系统就会做出响应的操作.这个"壳程序"是我们使用系统各种功能的接口,学会了 shell 就 ...

  5. python正则查找

    a = "#1+#5+#8+#10+#11+#12+#13+#14+#15-#22-#23-#24-#25-#26-#27-#28" b = re.findall("#\ ...

  6. redis 6种过期策略的具体方式

    redis 中的默认的过期策略是volatile-lru .设置方式 config set maxmemory-policy volatile-lru maxmemory-policy 六种方式 vo ...

  7. 数据同步gossip协议原理与应用场景介绍

    作者:京东物流 冯鸿儒 1 简介 Gossip是一种p2p的分布式协议.它的核心是在去中心化结构下,通过将信息部分传递,达到全集群的状态信息传播,传播的时间收敛在O(Log(N))以内,其中N是节点的 ...

  8. 线程基础知识11-CAS+自旋锁

    1.CAS是什么(CompareAndSet) CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果 ...

  9. .NET周报 【2月第2期 2023-02-11】

    国内文章 SQLSERVER的truncate和delete有区别吗? https://mp.weixin.qq.com/s/wTIeW8rjj3cRzoaQcg2sOw 在面试中我相信有很多朋友会被 ...

  10. Vue 注册全局组件的方式

    一.语法:Vue的实例.component("组件名称",组件) 1.方式一:这个组件就是 vue文件 import { createApp,h } from 'vue' //引入 ...