zoukankan      html  css  js  c++  java
  • log4donet 的 一篇简单使用实例

    背景

    最近在写一个Adapter,需要调用别的程序的DLL. Adapter使用的是C#还有.net的等方面的技术。今天在写log这块,就像尝试一下有没有“轮子”可以试试的。在网上搜罗了一番之后,决定就使用“log4net”吧。

    关于log4net

    简单来说,她是从log4j衍生出来的专门用于.net领域的一个写log的类库。支持 .net stardard,.net core等等。。。

    下载

    我们可以到 http://logging.apache.org/log4net/download_log4net.cgi 来下载,下载页面提供了很多种方式(binary or source)

    使用

    LZ这里是.net stardard,所以将下载完成后的压缩包解压,之后进入bin目录,找到对应的framework版本,选择引入“log4net.dll”

    个人的想法是把这个记录log的组件封装成一个library,所以新建一个ClassLibrary工程,在里面引入“log4net.dll”并且进行封装。项目组成如下图:

    其中:

    - LogHelper  是一个关于调用Log4net.dll方法的封装类。

    - LogLirary.config 该文件是一个配置文件,里面详细记录的log的输出/存储方式

    LogHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "LogLibrary.config", ConfigFileExtension = ".config", Watch = true)]
    namespace LogLibary
    {
    
        public enum LogLevel
        {
            Debug,
            Info,
            Warning,
            Error
        }
    
        public class LogHelper
        {
            public static void WriteLog(Type t, LogLevel logLevel, string msg)
            {
                log4net.ILog log = log4net.LogManager.GetLogger(t);
                switch (logLevel) 
                {
                    case LogLevel.Debug:
                        log.Debug(msg);
                        break;
    
                    case LogLevel.Info:
                        log.Info(msg);
                        break;
    
                    case LogLevel.Warning:
                        log.Warn(msg);
                        break;
    
                    case LogLevel.Error:
                        log.Error(msg);
                        break;
    
                    default:
                        log.Debug(msg);
                        break;
                }
            }
    
            public static void WriteLogWithException(Type t, LogLevel logLevel, string msg, Exception ex)
            {
                log4net.ILog log = log4net.LogManager.GetLogger(t);
                switch (logLevel)
                {
                    case LogLevel.Debug:
                        log.Debug(msg, ex);
                        break;
    
                    case LogLevel.Info:
                        log.Info(msg, ex);
                        break;
    
                    case LogLevel.Warning:
                        log.Warn(msg, ex);
                        break;
    
                    case LogLevel.Error:
                        log.Error(msg, ex);
                        break;
    
                    default:
                        log.Debug(msg, ex);
                        break;
                }
            }   
           
        }
    }
    标红的语句非常重要,它表明我们log输出依赖于configuration

    LogLibrary.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net>
        <!--定义输出到文件中-->
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
          <!--定义文件存放位置-->
          <file value="Log\"/>
          <appendToFile value="true"/>
          <rollingStyle value="Date"/>
          <datePattern value="yyyy\yyyyMM\yyyyMMdd'.txt'"/>
          <staticLogFileName value="false"/>
          <param name="MaxSizeRollBackups" value="100"/>
          <layout type="log4net.Layout.PatternLayout">
            <!--每条日志末尾的文字说明-->
            <!--输出格式-->
            <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
            <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/>
          </layout>
        </appender>
        <!--定义输出到控制台命令行中-->
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
          </layout>
        </appender>
        <root>
          <level value="ALL" />
          <!--文件形式记录日志-->
          <appender-ref ref="RollingLogFileAppender" />
          <!--控制台控制显示日志-->
          <appender-ref ref="ConsoleAppender" />
        </root>
      </log4net>
    </configuration>

    最后,写一个简单的测试类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using RabbitMQ.Client;
    using LogLibary;
    
    namespace Producer
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 1000; i++) // tested code here
                {
                  string message = String.Format("Hello there! number is: {0}", i.ToString());               
                   LogHelper.WriteLog(typeof(Program), LogLevel.Debug, string.Format(" set {0}", message));
                }
                       
                LogHelper.WriteLog(typeof(Program), LogLevel.Info, "1000 tasks sent out!!");          
    
                Console.ReadKey();
            }
        }
    }

    参考文献:

    http://logging.apache.org/log4net/release/config-examples.html

    http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html

    OK. 啰啰嗦嗦写了一堆,感谢大家的收看,预祝各位双11 “买买买!!”

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/atuotuo/p/7787605.html
Copyright © 2011-2022 走看看