【C#编程最佳实践 二十】日志与日志级别

简介: 【C#编程最佳实践 二十】日志与日志级别

在日常的开发中我们经常会用到日志,最近开发的时候老是听到别的其他开发人员让测试把日志级别从debug降到info或者等等之类的,所以就比较好奇日志级别到底有哪几种以及各种日志级别到底是怎么发挥作用的呢?于是看了下公司的源码,发现我们的log类是继承自log4net的,所以简单学习下该类。

日志级别

在log4Net中有7种日志级别,其中常用的有5种: DEBUG,INFO,WARN,ERROR,FATAL。级别从低到高,依照等级次序决定是否写入。

日志级别 备注
ALL Level ALL Level是最低等级的,用于打开所有日志记录。
DEBUG Level DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。
INFO level INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。
WARN level WARN level表明会出现潜在错误的情形。 记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。
ERROR level ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。
FATAL level FATAL level指出每个严重的错误事件将会导致应用程序的退出,记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环
OFF Level OFF Level是最高等级的,用于关闭所有日志记录。

高于等级设定值方法都能写入日志, Off所有的写入方法都不写到日志里,ALL则相反。例如当我们设成Info时,logger.Debug就会被忽略而不写入文件,但是FATAL,ERROR,WARN,INFO会被写入,因为他们等级高于INFO。在生产环境,建议把debug的日志级别重新调为warn或者更高,避免产生大量日志

日志配置

日志级别了解后需要在系统内加一个日志的配置文件:Log4Net.config。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
   <log4net debug="true">
      <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--file可以指定具体的路径 eg : d:\\test.log。不指定的话log被生成在项目的bin/Debug 或者 bin/Release目录下 (web的项目 默认生成在根目录下)-->
        <file value="applicationLog.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" /><!--备份log文件的个数最多10个-->
        <!--每个log文件最大是2M,如果超过2M将重新创建一个新的log文件,并将原来的log文件备份。-->
        <maximumFileSize value="2MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout"> <!--指定log的格式-->
          <conversionPattern value="[%date]  %thread -- %-5level -- %logger [%M] -- %message%newline" />
        </layout>
      </appender>
      <root>
        <level value="DEBUG" /><!--指定将此级别及以上的log打印到log文件中-->
        <appender-ref ref="RollingLogFileAppender" />
      </root>
   </log4net>
</configuration>

整个步骤其实就是先引入log4net的dll,然后引入到自己的项目中来,然后添加配置到 assemblyinfo.cs文件:

[assembly: log4net.Config.XmlConfigurator(ConfigFile="Log4Net.config", Watch=true)]

log4net源码

部分log4net的源码,不仅仅包括各种异常的定义,也包含一些异常打点的标准格式方法。

// Decompiled with JetBrains decompiler
// Type: log4net.ILog
// Assembly: log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905
// MVID: 4BFEBC64-FD47-43B4-B376-302A10C947E5
// Assembly location: D:\MultiTenant项目\packages\log4net.1.2.10.1\lib\net11\log4net.dll
using log4net.Core;
using System;
namespace log4net
{
  public interface ILog : ILoggerWrapper
  {
    void Debug(object message);
    void Debug(object message, Exception exception);
    void DebugFormat(string format, params object[] args);
    void DebugFormat(IFormatProvider provider, string format, params object[] args);
    void Info(object message);
    void Info(object message, Exception exception);
    void InfoFormat(string format, params object[] args);
    void InfoFormat(IFormatProvider provider, string format, params object[] args);
    void Warn(object message);
    void Warn(object message, Exception exception);
    void WarnFormat(string format, params object[] args);
    void WarnFormat(IFormatProvider provider, string format, params object[] args);
    void Error(object message);
    void Error(object message, Exception exception);
    void ErrorFormat(string format, params object[] args);
    void ErrorFormat(IFormatProvider provider, string format, params object[] args);
    void Fatal(object message);
    void Fatal(object message, Exception exception);
    void FatalFormat(string format, params object[] args);
    void FatalFormat(IFormatProvider provider, string format, params object[] args);
    bool IsDebugEnabled { get; }
    bool IsInfoEnabled { get; }
    bool IsWarnEnabled { get; }
    bool IsErrorEnabled { get; }
    bool IsFatalEnabled { get; }
  }
}

最后总结下关于日志的一些收获:

总而言之,常用的日志级别其实就四种:DEBUG,INFO,WARN,ERROR。然后我们大多数情况下只关心ERROR就可以,如果有时候通过ERROR定位不出问题,name通过修改配置文件将打印的日志级别降低为WARN(可以看WARN,ERROR)或者INFO(可以看INFO,WARN,ERROR)甚至DEBUG(可以看DEBUG,INFO,WARN,ERROR)来获取更多的信息,所以我常听到的开发让测试同学修改日志级别就明白了,调的越低能看到更多的辅助查问题的信息然后来查问题

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
1月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
12天前
|
运维 监控 Java
系统日志规范及最佳实践
系统日志规范及最佳实践
系统日志规范及最佳实践
|
4天前
|
监控 Java API
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
15 1
|
8天前
|
Java 程序员
技术日志:揭秘Java编程 —— 抽象类与接口的隐藏力量!
【6月更文挑战第17天】在Java编程中,抽象类和接口如同内功心法,增强代码灵活性和维护性。抽象类`Course`定义共性属性和行为,如显示大纲,子类如`ProgrammingCourse`继承并实现细节。接口`Ratable`提供评分功能,允许不同课程以多态方式实现。通过抽象类和接口,代码组织更有序,系统扩展性更强,犹如武侠高手以平凡招式创出非凡武学。不断学习和探索这些技术,能提升编程技艺,应对复杂挑战。
|
1月前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与日志管理最佳实践
【5月更文挑战第19天】 在现代微服务架构中,容器编排平台如Kubernetes已成为部署、管理和扩展应用程序的关键工具。随着其应用范围不断扩大,集群的稳定性和性能监控变得至关重要。本文将探讨针对Kubernetes集群的监控策略,并深入分析日志管理的实现方法。通过介绍先进的技术堆栈和实用工具,旨在为运维专家提供一套完整的解决方案,以确保集群运行的透明度和可靠性。
52 3
|
1月前
|
Prometheus 运维 Kubernetes
Kubernetes 集群的监控与日志管理最佳实践
【5月更文挑战第23天】 在容器化和微服务架构日益普及的当下,Kubernetes 已成为众多企业的首选平台。随之而来的是对集群性能、资源利用和运行状况的持续监控需求,以及日志管理的重要性。本文将探讨在 Kubernetes 环境中实现有效监控和日志管理的策略,涵盖关键组件的选择、配置优化及故障排查流程,旨在为运维工程师提供一套综合解决方案,确保集群的稳定性和高可用性。
|
1月前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
1月前
|
人工智能 C# 开发者
C#编程中的图形界面设计
【4月更文挑战第21天】本文探讨了C#在GUI设计中的应用,介绍了Windows Forms、WPF和UWP等常用框架,强调了简洁界面、响应式设计和数据绑定等最佳实践。通过实际案例,展示了C#在企业应用、游戏开发和移动应用中的GUI实现。随着技术发展,C#在GUI设计的未来将趋向于跨平台、更丰富的组件和AI集成,为开发者创造更多可能性。
|
1月前
编程日志01:个人网站更新用户头像
编程日志01:个人网站更新用户头像
18 0