C# Winform使用log4net记录日志

写在前面

Log4Net是从Java的log4j移植过来的,功能也与log4j类似,可以把日志信息输出到文件、数据库、控制台、Windows 事件日志、远程系统日志服务等不同的介质或目标。

Log4Net配置选项丰富灵活,并且可在运行时动态更新配置并应用,允许同时推送到多个目标;虽然项目已经休眠了,但是该类库已久经考验,经典的设计永不过时。

获取类库

可通过NuGet获取类库,引入到项目中。

配置模板

新建log4net.xml文件,命名成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="LogFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="INFO">
    <!--防止多线程时不能写Log,官方说线程非安全-->
    <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
    <param name="File" value="Logs/" />
    <param name="AppendToFile" value="true"/>
    <param name="StaticLogFileName" value="false" />
    <param name="DatePattern" value="yyyy-MM-dd.'info.log'" />
    <param name="RollingStyle" value="Date"/>
    <param name="MaxSizeRollBackups" value="10" />
    <param name="MaximumFileSize" value="5MB" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="## %d [%t] %-5p %x %m %n"/>
      <!--<param name="ConversionPattern" value="%date [%thread] %-5level [%logger] %ndc - %message%newline" />-->
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO" />
      <param name="LevelMax" value="INFO" />
    </filter>
  </appender>
  <appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="ERROR">
    <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
    <param name="File" value="Logs/" />
    <param name="AppendToFile" value="true"/>
    <param name="StaticLogFileName" value="false" />
    <param name="DatePattern" value="yyyy-MM-dd.'error.log'" />
    <param name="RollingStyle" value="Date"/>
    <param name="MaxSizeRollBackups" value="10" />
    <param name="MaximumFileSize" value="5MB" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%date [%thread] %-5level [%logger] %ndc - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="WARN" />
      <param name="LevelMax" value="ERROR" />
    </filter>
  </appender>
  <appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="ERROR">
    <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
    <param name="File" value="Logs/" />
    <param name="AppendToFile" value="true"/>
    <param name="StaticLogFileName" value="false" />
    <param name="DatePattern" value="yyyy-MM-dd.'debug.log'" />
    <param name="RollingStyle" value="Date"/>
    <param name="MaxSizeRollBackups" value="10" />
    <param name="MaximumFileSize" value="5MB" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%date [%thread] %-5level [%logger] %ndc - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="DEBUG" />
    </filter>
  </appender>
  <root>
    <level value="All" />
    <appender-ref ref="LogFileAppender" />
    <appender-ref ref="ErrorFileAppender"/>
    <appender-ref ref="DebugFileAppender" />
    <appender-ref ref="ConsoleAppender" />
  </root>
</log4net>

 将文件属性中的“复制到输出目录”配置为始终复制,这样配置文件会同步置执行或发布目录。

 引用并初始化类库

      
static Program()
{
    //加载log4net配置
    log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + @"\log4net.xml"));
}

也可以在AssemblyInfo.cs中进行初始化配置

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4Net.xml")] 

 工具类

    public static class LogHelper
    {
        public static void Info(object msg, params object[] parameters)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Info(msg);
        }

        public static void Debug(string msg)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Debug(msg);
        }

        public static void Error(string msg)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Error(msg);
        }

        public static void FormatError(string format, params object[] args)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Error(string.Format(format, args));
        }

        public static void Error(Exception ex)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Error(ex.Message, ex);
        }

        public static void Error(object msg, Exception ex)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Error(msg, ex);
        }

        public static void Warn(object msg, Exception ex)
        {
            var log = LogManager.GetLogger("log4netlogger");
            log.Warn(msg, ex);
        }

        public static void Log(string msg)
        {
            Info(msg);
        }

        public static void Log(Exception ex)
        {
            Error(ex);
        }

    }

调用示例

LogHelper.Info("事件类型出错,类型:" + _rv.EventType + ",参数:" + _rv.EventArgs);

LogHelper.Debug(string.Format("action_finish:{0}", TacticsName));

LogHelper.Error(string.Format("json序列化失败:{0}", json), ex);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/179350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dolphinscheduler有任务一直在运行(问题)目前对数据库解决

dolphinscheduler有任务一直在运行&#xff08;问题&#xff09;目前对数据库解决 危害&#xff1a; 这么多的任务没有结束&#xff0c;会涉及很多问题的&#xff0c;系统的数据盘会不断入职日志&#xff0c;数据量很大&#xff0c; 其实对于dolphinscheduler的性能是下降的&a…

git merge 和 git rebase

一、是什么 在使用 git 进行版本管理的项目中&#xff0c;当完成一个特性的开发并将其合并到 master 分支时&#xff0c;会有两种方式&#xff1a; git merge git rebasegit rebase 与 git merge都有相同的作用&#xff0c;都是将一个分支的提交合并到另一分支上&#xff0c;…

看图说话:对脏读、不可重复度、幻读进行总结

1、脏读 「事务B」将 id 为 1 的用户 name 修改为“小卡”&#xff0c;事务未提交。「事务A」查询 id 为 1 的用户数据&#xff0c;此时 name 已为“小卡”。 2、不可重复度 「事务A」第一次读取 id 为 1 的用户&#xff0c;name 是 “卡卡”。「事务B」将 id 为 1 的用户 nam…

Mac M1 安装Docker打包arm64的python项目的镜像包

1、首先安装Docker&#xff0c;到官网下载&#xff0c;选择apple chip版 Docker中文网 官网 2、双击下载的dmg文件&#xff0c;在弹出框中之间拖拽到右边 3、打开docker&#xff0c;修改国内镜像源&#xff0c;位置在配置-DockerEngine "registry-mirrors": ["…

Veritas NBU 5240机头右上角硬盘灯常灭居然是正常的?

在某次给客户硬件设备巡检的过程中&#xff0c;发现NBU机头右上角的那块硬盘指示灯没亮&#xff0c;当时第一反应就是硬盘坏了&#xff0c;之后赶紧去后台查硬盘的状态信息&#xff0c;发现都是正常的&#xff0c;没有任何报错现象和日志&#xff1b;然后就在想硬盘是好的&…

Python VisPy库:高性能科学可视化

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python VisPy库&#xff1a;高性能科学可视化&#xff0c;文章2800字&#xff0c;阅读大约10分钟&#xff0c;大家enjoy~~ VisPy是一个用于高性能科学可视化的Python库&…

python实现调和反距离空间插值法AIDW

1 简介 AIDW 主要是针对 IDW 的缺点进行了改进&#xff0c;考虑了样本点与预测点的位置&#xff0c;即方向和距离&#xff0c;具体见下图&#xff1a; 2 改进 IDW 公式&#xff1a; 从IDW算法可看出&#xff0c;插值点的估算值仅与插值样本距插值点的远近相关&#xff0c;并未…

Python基础【一】--入门知识[2023.11.22]

1 标识符 标识符是编程时使用的名字&#xff0c;用于给变量、函数、语句块等命名。 Python 中标识符由字母、数字、下划线组成&#xff0c;不能以数字开头&#xff0c;区分大小写。 2 关键字 上面表中是 Python 中的关键字&#xff08;保留字&#xff09;&#xff0c;我们在自定…

android11 申请所有文件访问权限

Android 11 引入了强制执行分区存储的限制&#xff0c;导致应用默认不能访问外部文件。 针对以前涉及较多文件的操作&#xff0c;可采用申请所有文件访问权限的方式来解决这一问题&#xff0c;实现方式如下。 &#xff08;虽然这样做安全性低&#xff0c;官方并不推荐这样&…

【Rxjava详解】(二) 操作符的妙用

文章目录 接口变化操作符mapflatmapdebouncethrottleFirst()takeconcat RxJava 是一个基于 观察者模式的异步编程库&#xff0c;它提供了丰富的操作符来处理和转换数据流。 操作符是 RxJava 的核心组成部分&#xff0c;它们提供了一种灵活、可组合的方式来处理数据流&#xf…

PHP如何持续监听Redis的消息订阅并推送到前端?

PHP如何持续监听Redis的消息订阅并推送到前端&#xff1f; 概述: 在许多Web应用程序中&#xff0c;实时推送消息是很常见的需求。当我们需要向前端实时发送消息时&#xff0c;往往会使用轮询或长轮询的方式去获取最新数据。但这种方式对服务器资源的消耗较大&#xff0c;同时响…

IP地址定位技术发展与未来趋势

随着互联网的快速发展&#xff0c;人们对网络的需求和依赖程度越来越高。在海量的网络数据传输中&#xff0c;IP地址定位技术作为网络安全与信息追踪的重要手段&#xff0c;其精准度一直备受关注。近年来&#xff0c;随着技术的不断进步&#xff0c;IP地址定位的精准度得到了显…

idea编译问题导致接口调用不通

问题背景&#xff1a; 1.idea版本2021&#xff0c;springboot&#xff0c;父子maven项目&#xff0c;创建了一个新的model。启动之后&#xff0c;调试controller接口&#xff0c;接口一直报404。 问题分析&#xff1a; 1.查看编译后的文件&#xff0c;发现java代码一直没编译…

art-template 模板引擎自定义函数 调用js函数 且不转义输出html 原始输出

一、自定义函数 template.defaults.imports.自定义函数名称function(你的参数){ }例子 使用 二、原始输出 {{你的数据名称}}例子如下&#xff0c;因为返回的是html&#xff0c;不原始输出层渲染不了 三、文档具体可参考 https://github.com/aui/art-template/tree/4.0.0…

rabbit MQ的延迟队列处理模型示例(基于SpringBoot延时插件实现)

rabbitMQ安装插件rabbitmq-delayed-message-exchange 交换机由此type 表示组件安装成功 生产者发送消息时设置延迟值 消息在交换机滞纳至指定延迟后&#xff0c;进入队列&#xff0c;被消费者消费。 组件注解类&#xff1a; package com.esint.configs;import org.springfra…

CSGO游戏搬砖市场下跌分析,是跑还是入?

CSGO市场下跌分析&#xff0c;是跑还是入&#xff1f; 以下所有都是阿阳本人最近几年观察市场和踩坑的一点经验&#xff0c;由于篇幅不长所以肯定会很浅薄&#xff0c;大伙下嘴轻点 。 首先现在真的是CSGO市场最低点吗&#xff1f;后续还会跌吗&#xff1f;我们究竟是该继续观…

【LeetCode刷题-链表】--25.K个一组翻转链表

25.K个一组翻转链表 思路&#xff1a; 把链表节点按照k个一组分组&#xff0c;可以使用一个指针head依次指向每组的头节点&#xff0c;这个指针每次向前移动k步&#xff0c;直至链表结尾&#xff0c;对于每个分组&#xff0c; 先判断它的长度是否大于等于k&#xff0c;若是&am…

在windows笔记本中安装tensorflow1.13.2版本的gpu环境2

tensorflow1.13.2版本的gpu环境 看python-anacona的安装只需要看1.1部分即可 目录 1.1 Anaconda安装 1.2 tensorflow-gpu安装 1.3 python编译器-pycharm安装 1.1 Anaconda安装 从镜像源处下载anaconda&#xff0c;地址&#xff1a;Index of /anaconda/archive/ | 北京…

代码随想录算法训练营第四十二天【动态规划part04】 | 01背包、416. 分割等和子集

01背包问题 题目链接&#xff1a; 题目页面 求解思路&#xff1a; 确定dp数组及其下标含义&#xff1a;dp[i][j] 表示从下标为 [0] 到 [i] 的物品里任意选取&#xff0c;放进容量为j的背包&#xff0c;此时的价值总和最大值确定递推公式&#xff1a; 不放物品i&#xff0c;…

git stash 用法总结

目录 1&#xff0c;介绍场景1&#xff1a;场景2&#xff1a; 2&#xff0c;常用命令2.1&#xff0c;基础2.2&#xff0c;进阶1&#xff0c;存储时指定备注2&#xff0c;通过索引来操作指定的存储3&#xff0c;修改存储规则 2.3&#xff0c;查看 stash 修改的具体内容 1&#xf…