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);

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue智能企业设备管理系统05k50

智能设备管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xf…

【python+requests】接口自动化测试

这两天一直在找直接用python做接口自动化的方法&#xff0c;在网上也搜了一些博客参考&#xff0c;今天自己动手试了一下。 一、整体结构 上图是项目的目录结构&#xff0c;下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类&#xff0c;比如数据库sql…

【开源】基于Vue和SpringBoot的独居老人物资配送系统

项目编号&#xff1a; S 045 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S045&#xff0c;文末获取源码。} 项目编号&#xff1a;S045&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

学生信息管理系统程序Python

系统主界面 在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;有两种方法&#xff0c; 一种是输入1&#xff0c;另一种是按下键盘上的↑或↓方向键进行选择。这两种方法的结果是一样的&#xff0c;所以使用哪种方法都可以。 &#xff08;…

使用echars实现数据可视化

生活随笔 展翅飞翔之际 请下定决心不再回头 echars实现数据可视化 在搭建后台页面时&#xff0c;可能会遇到很多的表格&#xff0c;但有时表格所展现的数据并不能直观的体现出当前用户的宏观信息&#xff0c;所以就可以引入一个新的表格插件——echars 快速上手 - Handbook…

(一)pytest自动化测试框架之生成测试报告(mac系统)

前言 我们可以通过pytest-html插件来生成测试报告&#xff0c;但是pytest-html插件生成的测试报告不够美观&#xff0c;逼格也不够高&#xff0c;通过allure生成的测试报告是比较美观的&#xff0c;花里胡哨的&#xff0c;能够提升一个level。 allure官网&#xff1a; Allure…

每日一练2023.11.27——考试座位号【PTA】

题目链接&#xff1a;L1-005 考试座位号 题目要求&#xff1a; 每个 PAT 考生在参加考试时都会被分配两个座位号&#xff0c;一个是试机座位&#xff0c;一个是考试座位。正常情况下&#xff0c;考生在入场时先得到试机座位号码&#xff0c;入座进入试机状态后&#xff0c;系…

MySQL的Redo Log跟Binlog

文章目录 概要Redo Log日志Redo Log的作用Redo Log的写入机制 Binlog日志Binlog的作用Binlog写入机制 两段提交 概要 Redo Log和Binlog是MySQL日志系统中非常重要的两种机制&#xff0c;也有很多相似之处&#xff0c;本文主要介绍两者细节和区别。 Redo Log日志 Redo Log的作…

详解开源数据库审计平台Yearning

基本概念 数据库审计&#xff08;简称DBAudit&#xff09;能够实时记录网络上的数据库活动&#xff0c;对数据库操作进行细粒度审计的合规性管理&#xff0c;对数据库遭受到的风险行为进行告警&#xff0c;对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报&…

Unity EventSystem的一些理解和使用

Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一&#xff0c;可以用于捕捉和分发各种事件&#xff0c;例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些&#xff1a; 属性&#xff1a; current: 获取当前的EventSystem实例。…

Oracle-客户端连接报错ORA-12545问题

问题背景: 用户在客户端服务器通过sqlplus通过scan ip登陆访问数据库时&#xff0c;偶尔会出现连接报错ORA-12545: Connect failed because target host or object does not exist的情况。 问题分析&#xff1a; 首先&#xff0c;登陆到连接有问题的客户端数据库上&#xff0c;…

1. git入门操作

1. git入门操作 1、基本名词解释 图片 名词含义index索引区&#xff0c;暂存区master分支名&#xff0c;每个仓库都有个master&#xff0c;它作为主分支。branch其他分支&#xff0c;我们可以把master分支上的代码拷贝一份&#xff0c;重新命名为其他分支名work space就是我…

Rust语言入门教程(七) - 所有权系统

所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源&#xff0c;也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统&#xff0c;才使得编译器能够提前暴露代码中的错误&#xff0c;并给出我们必要且精准的错误提示。 所有权系统的三个规则…

C语言——从终端(键盘)将 5 个整数输入到数组 a 中,然后将 a 逆序复制到数组 b 中,并输出 b 中 各元素的值。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i;int a[5];int b[5];printf("输入5个整数&#xff1a;\n");for(i0;i<5;i){scanf("%d",&a[i]);}printf("数组b的元素值为&#xff1a;\n");for(i4;i>0;i--…

qt5.15.2及6.0以上版本安装

文章目录 下载在线安装器安装打开软件 下载在线安装器 因为从qt5.15开始不支持离线下载安装了&#xff0c;只能通过在线安装的方式进行安装。 下载在线安装下载器&#xff1a; 这个在线安装下载器网上也都是可以找到。 这里是其放到网盘上的下载地址&#xff1a; 链接&#x…

leetcode LCR24反转单链表

反转单链表 题目描述 题目分析 先来说迭代的思想&#xff1a; 上面next cur->next应该放在cur->next pre前面执行&#xff0c;这里笔误 再来说递归的思想&#xff1a; 题目代码 这个代码里面我加了我自己写的测试数据&#xff0c;自己可以去找对应的部分&#xff0c…

java springboot在测试类中构建虚拟MVC环境并发送请求

好 上文java springboot在测试类中启动一个web环境我们在测试类中搭了一个web环境 那么 下面就要想办法弄一个接口的测试 这边 我们还是要在controller包下去创建一个 controller类 写一个访问接口 这里 我创建一个 TestWeb.java 这里 我们编写代码如下 package com.example.…

【数据结构复习之路】树和二叉树(严蔚敏版)万字详解主打基础

专栏&#xff1a;数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】&#xff0c;我们接着复习 树和二叉树&#xff0c;这篇文章我写的非常详细且通俗易懂&#xff0c;看完保证会带给你不一样的收获。如果对你有帮助&#xff0c;看在我这么辛苦整理…

CCFCSP试题编号:202206-2试题名称:寻宝!大冒险!

一、题目 二、分析 因为藏宝图左下角位置一定是一棵树&#xff0c;所以只要把所有绿化图中每一棵树&#xff0c;与之相匹配&#xff0c;然后判断&#xff0c;是否整个藏宝图都是绿化图的一部分&#xff0c;如果是那就计数count1。所以来看&#xff0c;结果count最大也就是n(绿…

1、Docker概述与安装

相关资源网站&#xff1a; ● docker官网&#xff1a;http://www.docker.com ● Docker Hub仓库官网: https://hub.docker.com/ 注意&#xff0c;如果只是想看Docker的安装&#xff0c;可以直接往下拉跳转到Docker架构与安装章节下的Docker具体安装步骤&#xff0c;一步步带你安…