C#控制台程序中使用log4.net来输出日志
Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft® .NET 运行时的端口。
我喜欢他可以自定义输出,区分等级等特点。
导入库
我们在工程里添加NuGet的包。输入名称log4net ,导入包。

创建配置文件
然后我们在项目根创建一个配置文件log4net.config
<?xml version="1.0" encoding="utf-8"?>
<log4net><!-- 将日志以回滚文件的形式写到文件中 --><!-- 按日期切分日志文件,并将日期作为日志文件的名字 --><!--Error--><appender name="ErrorLog" type="log4net.Appender.RollingFileAppender"><!--不加utf-8编码格式,中文字符将显示成乱码--><param name="Encoding" value="utf-8" /><file value="Log/"/><appendToFile value="true" /><rollingStyle value="Date" /><!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--><datePattern value=""ErrorLogs_"yyyyMMdd".log"" /><!--日志文件名是否为静态--><StaticLogFileName value="false"/><!--多线程时采用最小锁定--><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--布局(向用户显示最后经过格式化的输出信息)--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date| %-5level %newline%message%newline--------------------------------%newline" /></layout><filter type="log4net.Filter.LevelRangeFilter"><levelMin value="WARN" /><levelMax value="FATAL" /></filter></appender><!--Error--><!--Info--><appender name="InfoLog" type="log4net.Appender.RollingFileAppender"><!--不加utf-8编码格式,中文字符将显示成乱码--><param name="Encoding" value="utf-8" /><!--定义文件存放位置--><file value="Log/"/><appendToFile value="true" /><rollingStyle value="Date" /><!--日志文件名是否为静态--><StaticLogFileName value="false"/><!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--><datePattern value=""InfoLogs_"yyyyMMdd".log"" /><!--多线程时采用最小锁定--><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--布局(向用户显示最后经过格式化的输出信息)--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" /></layout><filter type="log4net.Filter.LevelRangeFilter"><levelMin value="INFO" /><levelMax value="INFO" /></filter></appender><!--Info--><!--Info--><appender name="DebugLog" type="log4net.Appender.RollingFileAppender"><!--不加utf-8编码格式,中文字符将显示成乱码--><param name="Encoding" value="utf-8" /><!--定义文件存放位置--><file value="Log/"/><appendToFile value="true" /><rollingStyle value="Date" /><!--日志文件名是否为静态--><StaticLogFileName value="false"/><!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--><datePattern value=""DebugLogs_"yyyyMMdd".log"" /><!--多线程时采用最小锁定--><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--布局(向用户显示最后经过格式化的输出信息)--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date| %-5level%c %newline%message%newline--------------------------------%newline" /></layout><filter type="log4net.Filter.LevelRangeFilter"><levelMin value="DEBUG" /><levelMax value="DEBUG" /></filter></appender><!--Info--><root><!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --><!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --><!-- 如果没有定义LEVEL的值,则缺省为DEBUG --><level value="ALL" /><!-- 按日期切分日志文件,并将日期作为日志文件的名字 --><appender-ref ref="ErrorLog" /><appender-ref ref="InfoLog" /><appender-ref ref="DebugLog" /></root>
</log4net>
使用类
我们创建一个单独的类来使用他。
using log4net;namespace MMCEngine
{internal class Loger{readonly static ILog logger = LogManager.GetLogger(" MMCEngine ");public Loger() {Thread.CurrentThread.Name = "main";//为了让主线程名显示string path = @"../../../log4net.config";FileInfo file = new FileInfo(path);log4net.Config.XmlConfigurator.Configure(file);Console.WriteLine("loger");}public static void Debug(string str){Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss")+" DEBUG:" + str);logger.Debug(str);}public static void Info(string str){Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss") + " INFO:" + str);logger.Info(str);}public static void Warn(string str){Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss") + " WARN:" + str);logger.Warn(str);}public static void Error(string str){Console.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss") + " ERROR:" + str);logger.Error(str);}}
}
使用
在Program.cs中
new Loger();
// 调用Python脚本的Test函数
Loger.Info("info1");
Loger.Info("info2");
Loger.Debug("Debug3");
Loger.Warn("Warn4");
Loger.Error("err5");

我们可以根据配置文件来生成不同的Log,配置文件里我分为了3个等级。
参考
https://www.cnblogs.com/netcore5/articles/14611567.html
相关文章:
C#控制台程序中使用log4.net来输出日志
Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft .NET 运行时的端口。 我喜欢他可以自定义输出,区分等级等特点。 导入库 我们在工程里添加NuGet的包。输入名称log4net ࿰…...
用GPT干的18件事,能够真正提高学习生产力,建议收藏
用GPT干的18件事,能够真正提高学习生产力,建议收藏。 语法更正 文本翻译 语言转换 代码解释 修复代码错误 作为百科全书 信息提取 好友聊天 创意生成器 采访问题 论文大纲 故事创作 问题类比 创建 SQL 需求 情感分析 将产品描述转变为广告 关键字提取 闲…...
线性代数的本质(二)——线性变换与矩阵
文章目录 线性变换与矩阵线性变换与二阶方阵常见的线性变换复合变换与矩阵乘法矩阵的定义列空间与基矩阵的秩逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数。通常选用平面坐标系 O x y Oxy Oxy ,基向量为 i , j \mathbf i,…...
JavaScript获取字符串的字节长度
概要 提示:大家都知道,获取字符串的长度可用length来获取。 那么获取这段字符串的字节数呢?英文字母肯定lenght和字节数都一样:都是1而中文lenght1,字节数2因此,需要作的就是把中文字符的字节数计算出来。 …...
[2023.09.13]: Rust Lang,避不开的所有权问题
Rust的所有权问题,在我学Rust的时候就跳过了,因为我知道这玩意儿没有场景就不好理解。没想到场景很快就出现了。 在开发Yew应用组件的时候,涉及到了事件,闭包,自然就引出了所有权问题。 话不多说,下面让我们…...
Redux中间件源码解析与实现
基本介绍 本文中涉及到的关键npm包的版本信息如下: react 的版本为18.2.0 redux的版本为4.1.2 redux-thunk版本为2.4.2 redux-promise版本为0.6.0 redux-logger版本为3.0.6 在Redux源码解析与实现(一)Redux源码解析与实现(二&…...
关于rsync用不了之后
1.尝试找出rsync使用错误原因: 我遇见一个问题:rsync:read errors mapping:communication error on send (70),我查了一下这个问题很大可能是网络链接导致的,然后我用nslookup指令查看了/train2…...
由一个多线程并发保存而引发的思考
1. 问题描述 问题描述,现A表(用户查看实验的次数)有user_id和exp_id两个字段,其中user_id加exp_id不唯一。B表有user_id,exp_id以及exp_num三个字段,其中user_id加exp_id唯一(表中未建唯一索引)。 现需要将A表的数据同步到B表,单机模式通过定时任务同步。A表的数据有…...
python-vlc
文章目录 关于 python-vlc安装使用关于 python-vlc Python vlc bindings github : https://github.com/oaubert/python-vlcPython bindings (ctypes-based) for VLC http://olivieraubert.net/vlc/python-ctypes/关于 VLC 可参考 macOS - 安装使用 VLC https://blog.csdn.net/…...
2023长城杯 web部分题目(seekingeasy_extension)
seeking 下载题目附件得到: <?php error_reporting(0); header("HINT:POST n range(1,10)");$image $_GET[image]; echo "这里什么也没有,或许吧。"; $allow range(1, 10); shuffle($allow); if (($_POST[n] $allow[0])) …...
2-1 张量数据结构
张量概念 张量是什么? 单个元素叫标量(scalar),一个序列叫向量(vector),多个序列组成的平面叫矩阵(matrix),多个平面组成的立方体叫张量(tensor&…...
QSqlQuery查询语句
SqlQuery 封装了在 QSqlDatabase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。 可用于执行 DML(数据操作语言)语句,如 SELECT、INSERT、UPDATE 和 DELETE, 以及 DDL(数据定义语言)语句ÿ…...
用c语言编写出三底模型
以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据,判断是否出现三底形态,如果是,则输出买入信号,否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…...
15 Python使用MySQL
概述 在上一节,我们介绍了如何在Python中使用网络,包括:套接字编程、socketserver等内容。在这一节,我们将介绍如何在Python中使用MySQL。MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,…...
3、Nginx 常用的命令和配置文件
文章目录 3、nginx 常用的命令和配置文件3.1 nginx 常用的命令:3.2 nginx.conf 配置文件3.2.1 地址3.2.2 内容3.2.2 vim不正常退出后再次打开信息提示解决方法 3.3 第一部分:全局块3.4 第二部分:events 块3.4 第三部分:http 块①、…...
python经典百题之兔子出生问题
这是一个经典的 Fibonacci 数列问题,可以通过递归或循环来解决。 递归方法: 由题意可知,第 n 个月的兔子数等于第 n-1 个月的兔子数加上第 n-2 个月的兔子数。设 f(n) 表示第 n 个月的兔子数,则有: f(n) f(n-1) f…...
不定积分的概念和性质
目录 原函数 不定积分 不定积分的几何意义 原函数的存在定理 不定积分的性质 不定积分是微积分的一个关键部分,它涉及到一个函数的不定积分的计算。不定积分可以理解为求一个函数的原函数,也被称为反导数。原函数是一个函数,使得该函数的…...
远程访问服务器JupyterLab的配置方法
远程访问服务器JupyterLab的配置方法 环境及工具注意 基本步骤生成密码生成并修改配置文件*错误:jupyter localhost 已拒绝连接*后台运行jupyter后台关闭 其实就是在服务器运行JupyterLab,然后在本地浏览器访问 环境及工具 服务器:Ubuntu 1…...
Java native 关键字
如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…...
【线性代数】沉浸式线性代数在线学习网站
地址:http://immersivemath.com/ila/index.html 这是全球第一本带交互式图形的线性代数教材,作者是 J. Strm, K. strm, and T. Akenine-Mller。 全书一共十章,各章节内容如下: 接下来我将对各章节进行简单的总结,另外…...
Speechless:三步完成微博PDF备份的终极免费Chrome扩展
Speechless:三步完成微博PDF备份的终极免费Chrome扩展 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在数字时代,我们的社交…...
终极macOS清理神器:Pearcleaner 3步彻底卸载应用不留痕迹
终极macOS清理神器:Pearcleaner 3步彻底卸载应用不留痕迹 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾将macOS应用拖入废纸篓后&…...
立体孪生全域可视,实现仓储人货动线全周期透明管控
立体孪生全域可视,实现仓储人货动线全周期透明管控副标题:动态三维实时还原库区人员、物资、车辆立体态势,运用库区无感定位、跨货架跨镜长距跟踪、身体指纹在岗确权,出入库、巡检、值守、调度全程透明可追溯一、方案总览现代规模…...
2026生鲜店收银软件特点功能对比
每天傍晚高峰期,生鲜店门口排起的长队总是让店主心头一紧。顾客手里拿着刚挑好的蔬菜水果,眼神里透着急切,而收银台前的店员却还在手忙脚乱地查找商品代码、手动输入重量,甚至因为系统卡顿导致支付失败。这种场景不仅流失了潜在客…...
从开源物理拼图游戏学习Unity 2D物理引擎与游戏架构设计
1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目,叫“openclaw-puzzle-game”。光看名字,你可能会觉得这又是一个普通的开源拼图游戏,但点进去仔细研究后,我发现它的设计思路和实现方式,对于想学习游戏开…...
Helm-Intellisense:VS Code智能补全插件,提升values.yaml编写效率
1. 项目概述:为什么我们需要一个Helm智能补全工具?如果你和我一样,日常工作中大量使用Helm来管理Kubernetes应用,那你一定对编写values.yaml文件时那种“盲人摸象”的感觉深有体会。面对一个动辄几十上百行配置的Helm Chart&#…...
智能GUI自动化:从SAG架构到实战部署的完整指南
1. 项目概述与核心价值最近在开源社区里,我注意到一个挺有意思的项目,叫openclaw-skill-sag。乍一看这个标题,可能会觉得有点抽象,但如果你对自动化、机器人流程自动化(RPA)或者智能体(Agent&am…...
从图片到摄像头:用YOLOv8n.pt模型在Win10上实现实时目标检测(代码+命令详解)
从图片到摄像头:用YOLOv8n.pt模型在Win10上实现实时目标检测(代码命令详解) 当计算机视觉遇上边缘计算,目标检测技术正在重塑人机交互的边界。YOLOv8作为当前最先进的实时检测框架之一,其轻量级版本yolov8n.pt在普通消…...
EL线创客工作坊:从零到一的电致发光项目实践指南
1. 项目概述:为什么EL线工作坊是创客入门的绝佳选择如果你正在寻找一个能让新手快速上手、成品炫酷、且能完美融合电子与手工的创客项目,EL线工作坊几乎是一个无可挑剔的答案。EL,即电致发光,它不像LED那样依赖一个个分立的光点&a…...
AI智能体操作安卓设备:基于agent-droid-bridge的自动化实践
1. 项目概述:连接AI与安卓设备的桥梁 最近在折腾AI智能体(Agent)和自动化流程时,遇到了一个挺有意思的需求:如何让运行在服务器上的AI程序,直接去操作一台真实的安卓手机或模拟器,完成一些复杂的…...
