zoukankan      html  css  js  c++  java
  • 使用 Trace 将日志输入到文件中

    工具没有好坏,只有适不适用。由于项目中用 Log4Net 过重,所以使用 Trace 代替了 Log4Net 输入一些简单的日志信息;

    自定义监听文件

    using System;
    using System.Configuration;
    using System.Diagnostics;
    using System.IO;
    
    namespace Iron.Common
    {
        /// <summary>
        /// 错误日志自定义监听
        /// </summary>
        public class LogHelper : TraceListener
        {
            /// <summary>
            /// 获取日志输出级别
            /// </summary>
            public static TraceSwitch TraceSwitch = new TraceSwitch("TraceLevel", string.Empty);
    
            public LogHelper()
            {
                if (TraceSwitch.Level == TraceLevel.Off)
                {
                    TraceSwitch.Level = TraceLevel.Error;
                }
            }
    
            /// <summary>
            /// 如果AppConfig 里面有配置就读配置文件里面的路径,否则取当前exe目录
            /// </summary>
            private string FilePath
            {
                get
                {
                    string directPath = ConfigurationManager.AppSettings["LogFilePath"];    //获得文件夹路径
                    if (string.IsNullOrEmpty(directPath))
                    {
                        directPath = System.Environment.CurrentDirectory + @"logs";
                    }
                    directPath = directPath.Trim();
                    if (!Directory.Exists(directPath))   //判断文件夹是否存在,如果不存在则创建
                    {
                        Directory.CreateDirectory(directPath);
                    }
                    return string.Format(@"{0}{1}_{2}.log", directPath, DateTime.Now.ToString("yyyy.MM.dd"), System.Diagnostics.Process.GetCurrentProcess().ProcessName);
                }
            }
    
    
            public override void Write(string message)
            {
                File.AppendAllText(FilePath, message);
            }
    
            public override void WriteLine(string message)
            {
                File.AppendAllText(FilePath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);
            }
    
            public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message)
            {
                if ((int)TraceSwitch.Level + 1 >= (int)eventType)
                    base.TraceEvent(eventCache, source, eventType, id, message);
            }
    
    
            public override void Write(object o, string category)
            {
                string msg = "";
    
                if (string.IsNullOrEmpty(category) == false) //category参数不为空
                {
                    msg = category + " : ";
                }
    
                if (o is Exception) //如果参数o是异常类,输出异常消息+堆栈,否则输出o.ToString()
                {
                    var ex = (Exception)o;
                    msg += ex.Message + Environment.NewLine;
                    msg += ex.StackTrace;
                }
                else if (o != null)
                {
                    msg = o.ToString();
                }
    
                WriteLine(msg);
            }
        }
    }

    测试代码

    private static void Main(string[] args)
    {
        //删除初始化代码,改为在配置文件中设置--【此代码只要在程序运行时初始化一次】
        Trace.Listeners.Clear();  //清除系统监听器 (就是输出到Console的那个)
        Trace.Listeners.Add(new LogHelper()); //添加 自定义Trace 实例
    
        
        try
        {
            int a = 10;
            int b = 0;
            var sd = a / b;
        }
        catch (Exception ex)
        {
            Trace.TraceError("{0}
    {1}", ex.Message, ex.StackTrace);
        }
        return;
    }

    输出日志为:

    ODAS.exe Error: 0 : 2017-08-24 00:05:28    Attempted to divide by zero.
       at Ironfo.Test.Views.Demo01.List.ControlRefresh(Object sender, RoutedEventArgs routedEventArgs) in C:CodeODASViewsDemo01List.xaml.cs:line 43

    如果要修改日志的级别、修改日志输出目录,可修改配置文件:

    <configuration>
       <!-- 默认输入为 Error 【默认为Off,已在代码中修改为Error】 -->
      <system.diagnostics>
        <switches>
          <!--这里可以设定监听级别,可以设置Error,Warning,Info,Verbose或者留空-->
          <add name="TraceLevel" value="Info"/>
        </switches>
      </system.diagnostics>
      <appSettings> 
        <!-- 默认为执行文件所在的目录 -->
        <!--<add key="LogFilePath" value="D:LOG" />-->
      </appSettings>
    </configuration>

    注意:Trace.Write() 等日志输出方法,不受等级的限制

  • 相关阅读:
    写爬虫,怎么可以不会正则呢?
    从 Scrapy 学习模块导入技巧
    博客已搬家至CSDN
    更改JDK默认编码,解决DBeaver乱码问题
    【2020面试】- Java中常见集合的默认大小以及扩容机制
    【2020面试】- CAS机制与自旋锁
    【2020面试】- filter和interceptor的区别
    【20k中级开发】-面试题201117
    【开发笔记】
    RPC 调用和 HTTP 调用的区别
  • 原文地址:https://www.cnblogs.com/vipsoft/p/7421012.html
Copyright © 2011-2022 走看看