首页 > 其他分享 >WPF-log4net学习笔记(一)

WPF-log4net学习笔记(一)

时间:2022-10-19 13:44:52浏览次数:77  
标签:log4net log 笔记 public static WPF message 日志

  Log4Net官方文档

1.创建MS SQL Server日志表

CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)

2.日志表配置-log4net.config中添加(把参数改成自己的,启用了保存到数据库和csv文件)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!-- log4net-将日志写入日志文件_按天滚动日志文件,日志文件最大2048KB 最多个数为-1无限个 -->
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!-- RollingFileAppender以FileAppender为基础 -->
<File value="Log\" />
<!--<file value="${TMP}\LOGS\" /> tmp为环境变量里的路径值,未配置环境变量地址就生成在temp中,log-file.txt为文件名 -->
<param name="AppendToFile" value="true" />
<!-- 指定是追加到还是覆盖掉已有的日志文件 -->
<!--<lockingModel type="log4net.Appender.FileAppender+InterProcessLock" />-->
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<!-- 启用最小锁定格式以允许多个进程可以写入同一个文件-->
<param name="RollingStyle" value="Composite" />
<!--按照何种方式产生多个日志文件(指明文件名是变动的,日期[Date],文件大小[Size],混合[Composite])-->
<StaticLogFileName value="false" />
<DatePattern value="yyyy\\MM\\dd\\CSV_yyyy-MM-dd'.csv'" />
<MaxSizeRollBackups value="-1" />
<!-- 最多个数为-1无限个-->
<MaximumFileSize value="2MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n=========
%n【日志级别】,【记录时间】,【线程ID】,【出错文件】,【出错行号】,【出错的类】,【属性】,【错误描述】,【错误详情】,
%n %-5level,%date,[%thread],%F,%L,%logger,[%property{NDC}],%message,%newline," />
</layout>
</appender>
log4net-日志表配置
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="0" />
<!--满n条就写到数据库-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=172.***.1.***;initial catalog=DBNAME;Persist Security Info=True;User ID=sa;Password=pwd123123" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>

<!-- log4net-警告的信息级别区分 -->
<!--<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程ID】[%thread]
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性:[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline" />
</layout>
</appender>-->
<!-- log4net-消息缓冲区配置(将日志信息进行缓存,达到10条时把日志输出,只有WARN及更高级别时才会被记录 ) -->
<!--<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" >
<bufferSize value="5"/>
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<appender-ref ref="ConsoleAppender" />
</appender>-->
<!--log4net-ERROR消息打印到控制台_红底白字-->
<!--<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="White" />
<backColor value="Red, HighIntensity" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow" />
</mapping>
<mapping>
<level value="INFO" />
<foreColor value="White" />
</mapping>
<mapping>
<level value="DEBUG" />
<backColor value="Green" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程ID】[%thread]
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性:[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline" />
</layout>
</appender>-->
<!-- log4net-将日志消息定向到控制台错误流 -->
<!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<target value="Console.Error" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程ID】[%thread]
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性:[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline" />
</layout>
</appender>-->
<!-- log4net-将日志写入本地机器的应用程序事件日志中 -->
<!--<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
<applicationName value="MyApp" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程ID】[%thread]
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性:[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline" />
</layout>
</appender>-->
<!-- 向指定网络sink发送日志 -->
<!--<appender name="RemotingAppender" type="log4net.Appender.RemotingAppender" >
<sink value="tcp://localhost:8085/LoggingSink" />
<lossy value="true" />
<bufferSize value="95" />
<onlyFixPartialEventData value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
</appender>-->
<!-- 向指定邮箱发送日志 -->
<!--<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
<to value="***@qq.com" />
<from value="[email protected]" />
<username value="[email protected]" />
-->
<!--为客户端授权码-->
<!--
<password value="***********" />
<subject value="B2P主控中心Error警告" />
<smtpHost value="SMTPServer.qq.com" />
<bufferSize value="512" />
-->
<!-- 大小超过512发送一次-->
<!--
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator,log4net">
<threshold value="WARN" />
</evaluator>
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="
%n【log4net的HostName】%property{log4net:HostName} ::
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程ID】[%thread]
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性:%property{NDC}
%n【错误描述】%message
%newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC:
%n【错误详情】%newline%newline" />
</layout>
</appender>-->
<!-- 使用SmtpPickupDir时的配置-->
<!--<appender name="SmtpPickupDirAppender" type="log4net.Appender.SmtpPickupDirAppender">
<to value="[email protected]" />
<from value="[email protected]" />
<subject value="test logging message" />
<pickupDir value="C:\SmtpPickup" />
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程ID】[%thread]
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性:[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline" />
</layout>
</appender>-->
<root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<appender-ref ref="RollingFileAppender" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
</configuration>

3.引用log4net的Nuget包

 

4.添加log4net-helper

(1)第一版

using log4net;
using System;
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
namespace HOST_CONTROL_CENTER.Uril.LogHelper
{
    /// <summary>
    /// Log4NetHelper
    /// </summary>
    public class Log4NetHelper
    {
        #region 执行SQL日志
        /// <summary>
        /// 普通日志
        /// </summary>
        /// <param name="message">日志内容</param>
        public static void WriteInfo(Type type, string message)
        {
            ILog log = log4net.LogManager.GetLogger("Info");  // 可以改成type typeof(类)
            if (log.IsInfoEnabled)
            {
                log.Info(message);
            }
            log = null;
        }

        /// <summary>
        /// 警告日志
        /// </summary>
        /// <param name="message">警告日志</param>
        public static void WriteWarn(Type type, string message)
        {
            ILog log = log4net.LogManager.GetLogger("Warn");
            if (log.IsWarnEnabled)
            {
                log.Warn(message);
            }
            log = null;
        }

        /// <summary>
        /// 错误日志
        /// </summary>
        /// <param name="message">错误日志</param>
        public static void WriteError(Type type, string message)
        {
            ILog log = log4net.LogManager.GetLogger("Error");
            if (log.IsInfoEnabled)
            {
                log.Error(message);
            }
            log = null;
        }
        #endregion

        public static void TestLog(string aa= "错误")
        {
            ILog log = log4net.LogManager.GetLogger("Info");
            log.Error("Hello World!");
        }
    }
}

(2)第二版(用这个就够用)

 1 using log4net;
 2 using System;
 3 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
 4 namespace HOST_CONTROL_CENTER.Uril.LogHelper
 5 {
 6     /// <summary>
 7     /// Log4NetHelper
 8     /// </summary>
 9     public class Log4NetHelper
10     {
11         #region 执行SQL日志
12         /// <summary>
13         /// 普通日志
14         /// </summary>
15         /// <param name="message">日志内容</param>
16         public static void WriteInfo(Type type, string message)
17         {
18             ILog log = log4net.LogManager.GetLogger(type);
19             if (log.IsInfoEnabled)
20             {
21                 log.Info(message);
22             }
23             log = null;
24         }
25 
26         /// <summary>
27         /// 警告日志
28         /// </summary>
29         /// <param name="message">警告日志</param>
30         public static void WriteWarn(Type type, string message)
31         {
32             ILog log = log4net.LogManager.GetLogger(type);
33             if (log.IsWarnEnabled)
34             {
35                 log.Warn(message);
36             }
37             log = null;
38         }
39 
40         /// <summary>
41         /// 错误日志
42         /// </summary>
43         /// <param name="message">错误日志</param>
44         public static void WriteError(Type type, string message)
45         {
46             ILog log = log4net.LogManager.GetLogger(type);
47             if (log.IsInfoEnabled)
48             {
49                 log.Error(message);
50             }
51             log = null;
52         }
53         #endregion
54 
55         public static void TestLog(string aa= "错误")
56         {
57             ILog log = log4net.LogManager.GetLogger("Info");
58             log.Error("Hello World!");
59         }
60     }
61 }

测试例子:

 1   private void mitPInfo_Click(object sender, RoutedEventArgs e)
 2         {
 3             Log4NetHelper.WriteInfo(typeof(MianShow), "信息");
 4         }
 5 
 6         private void mitPWarn_Click(object sender, RoutedEventArgs e)
 7         {
 8             Log4NetHelper.WriteWarn(typeof(MianShow), "警告");
 9         }
10 
11         private void mitPError_Click(object sender, RoutedEventArgs e)
12         {
13             try{
14                 int a = Convert.ToInt32("aa");
15             }
16             catch
17             {
18                 Log4NetHelper.WriteError(typeof(MianShow), "a错误");
19             }
20         }
21 
22         private void mitPError1_Click(object sender, RoutedEventArgs e)
23         {
24             try
25             {
26                 int a = Convert.ToInt32("aa");
27                 Log4NetHelper.TestLog("a错误");
28             }
29             catch
30             {
31                 Log4NetHelper.TestLog("a错误");
32             }
33         }

结果:

  日志文件:

   数据库:

(3)其他版本:

  1 using log4net;
  2 using log4net.Appender;
  3 using log4net.Config;
  4 using log4net.Repository.Hierarchy;
  5 using System;
  6 using System.IO;
  7 
  8 //[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
  9 namespace HOST_CONTROL_CENTER.Uril.LogHelper
 10 {
 11     public class Log4Helper2
 12     {
 13         private static ILog ILogger;
 14         private static string configFile = "log4net.config";
 15 
 16         static Log4Helper2()
 17         {
 18             if (File.Exists(Log4NetConfigFile))
 19             {
 20                 if (Environment.OSVersion.Platform == PlatformID.Win32NT)
 21                 {
 22                     XmlConfigurator.ConfigureAndWatch(new FileInfo(Log4NetConfigFile));
 23                 }
 24                 else
 25                 {
 26                     XmlConfigurator.Configure(new FileInfo(Log4NetConfigFile));
 27                 }
 28             }
 29             else
 30             {
 31                 BasicConfigurator.Configure();
 32             }
 33 
 34             ILogger = GetLogger(typeof(Log4Helper2));
 35         }
 36 
 37         #region Abbributes
 38         public static string Log4NetConfigFile
 39         {
 40             get
 41             {
 42                 return Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), configFile);
 43 
 44             }
 45         }
 46 
 47         public static ILog GetLogger(System.Type type)
 48         {
 49             return LogManager.GetLogger(type);
 50         }
 51         #endregion
 52 
 53         #region 执行SQL日志
 54         public static void Info(string message)
 55         {
 56             ILogger.Info(message);
 57         }
 58 
 59         public static void Warn(string message)
 60         {
 61             ILogger.Warn(message);
 62         }
 63 
 64         public static void Error(string message)
 65         {
 66             ILogger.Error(message);
 67         }
 68         #endregion
 69 
 70         /// <summary>
 71         /// 清理log文件
 72         /// </summary>
 73         /// <param name="keepDays"></param>
 74         public static void ClearOldLogFiles(string keepDays)
 75         {
 76             int days = 0;
 77             int.TryParse(keepDays, out days);
 78             if (days <= 0)
 79             {
 80                 return;
 81             }
 82 
 83             try
 84             {
 85                 DateTime now = DateTime.Now;
 86 
 87                 Hierarchy hierarchy = (Hierarchy)LogManager.GetLoggerRepository();
 88                 foreach (IAppender appender in hierarchy.Root.Appenders)
 89                 {
 90                     if (appender is RollingFileAppender)
 91                     {
 92                         string logPath = ((RollingFileAppender)appender).File;
 93                         DirectoryInfo dir = new DirectoryInfo(logPath.Substring(0, logPath.LastIndexOf("\\")));
 94 
 95                         foreach (FileInfo file in dir.GetFiles())
 96                         {
 97                             if (file.LastWriteTime < now.AddDays(-days))
 98                             {
 99                                 file.Delete();
100                             }
101                         }
102                     }
103                 }
104             }
105             catch
106             {
107             }
108         }
109     }
110 }

参考文档:https://logging.apache.org/log4net/release/config-examples.html

标签:log4net,log,笔记,public,static,WPF,message,日志
From: https://www.cnblogs.com/qq2806933146xiaobai/p/16805947.html

相关文章

  • 【DS】线段树分治学习笔记
    \(\circ\)给你一堆操作,每个操作都有自己的影响时间,查询某一时间点的状态。线段树分治:按时间轴*修改保存到\(\log\)个区间里,将询问离线查询,时刻\(t\)的询问就是线段......
  • 烂笔头笔记:Windows 10下配置ssh免密钥访问需要注意的事项
    目录​​简介​​​​开启ssh-agent服务​​​​密钥文件访问权限问题​​​​关于多个密钥如何使用​​​​关于多个服务器如何使用​​​​测试配置是否正确​​简介从Win......
  • 烂笔头笔记:macOS卸载Adobe产品后,在Launchpad上遗留空文件夹的解决方法
    首先声明,这个解决方法翻译自Adobe社区官网的一篇回答,限于在度娘中没有找到过靠谱的答案,在此进行翻译,有遇到同样问题的同学可以参考。原文地址:https://community.adobe.com/t......
  • Image Segmentation Using Text and Image Prompts论文阅读笔记
    ImageSegmentationUsingTextandImagePrompts论文阅读笔记摘要对于传统的分割方法,训练好后如果需要纳入新的类别,带来的成本是很高的。因此作者提出了一个系统,可以在......
  • 学习笔记8
    第五章定时器及时钟服务硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一个......
  • Linux系统编程 第13章学习笔记
    TCP/IP和网络编程 TCP/IP协议TCP/IP(Comer1988,2001;RFC11801991)是互联网的基础。TCP代表传输控制协议。IP代表互联网协议。   IP主机和IP地址主机是......
  • Linux系统编程 第14章学习笔记
    MySQL数据库系统 MySQL简介MySQL(MySQL2018)是一个关系数据库系统 MySQL安装sudoapt-getinstallmysql-server  MySQL使用安装、显示、新建、删除、选择......
  • Linux系统编程 第11章学习笔记
    EXT2文件系统磁盘是用来储文件的,但是必须先把磁盘格式化为某种格式的文件系统,才能存储文件。文件系统的目的就是组织和管理磁盘中的文件。在Linux系统中,最长见的是ext2......
  • Linux系统编程 第12章学习笔记
    块设备I/O和缓冲区管理 块设备I/O缓冲区I/O缓冲区作为块设备的缓存内存存在I/O缓冲的基本原理非常简单。文件系统使用一系列I/O缓冲区作为块设备的缓存内存。当进程......
  • Linux系统编程 第3章学习笔记
    Unix/Linux进程管理多任务处理:在单处理器(单CPU)系统中.一次只能执行一个任务-多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务......