工具没有好坏,只有适不适用。由于项目中用 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 + >= (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 = ;
int b = ;
var sd = a / b;
}
catch (Exception ex)
{
Trace.TraceError("{0}\r\n{1}", ex.Message, ex.StackTrace);
}
return;
}

输出日志为:

ODAS.exe Error:  : -- ::    Attempted to divide by zero.
at Ironfo.Test.Views.Demo01.List.ControlRefresh(Object sender, RoutedEventArgs routedEventArgs) in C:\Code\ODAS\Views\Demo01\List.xaml.cs:line

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

<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() 等日志输出方法,不受等级的限制

使用 Trace 将日志输入到文件中的更多相关文章

  1. 使用exec函数将当前的信息输入到文件中

    先来看看exec函数: exec函数族     fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函 ...

  2. C#写入日志信息到文件中

    为了在服务器上运行程序及时的跟踪出错的地方,可以在必要的地方加入写日志的程序. string folder = string.Format(@"D:\\{0}\\{1}", Dat ...

  3. Log4j分级别保存日志到单个文件中,并记录IP和用户信息

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...

  4. php把错误日志输入到文件里。

    display_errors = On 开启状态下,若出现错误,则报错,出现错误提示 dispaly_errors = Off 关闭状态下,若出现错误,则提示:服务器错误.但是不会出现错误提示 log ...

  5. log4j+AOP 记录错误日志信息到文件中

    AOP 采用异常通知切入,把指定包的异常记录到日志文件. 先看log4j.properties ,控制台输出的是普通信息, 文件输出的是异常信息. log4j.rootLogger=DEBUG, Co ...

  6. python logging日志输出个文件中

    # -*- coding:utf-8 -*- import logging # 引入logging模块 import os.path import time # 第一步,创建一个logger logg ...

  7. linux下将终端的输入存入文件中

    代码很简单: #include <stdlib.h> #include <fcntl.h> #include <stdio.h> #include <unis ...

  8. 把Android studio的日志导入目标文件中

    最好是在Android studio的命令行工具中进行命令操作. adb logcat -v time > /Users/z/log.txt adb logcat -v time > /U ...

  9. ios 将Log日志重定向输出到文件中保存

    对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment目录下,并设置成共享文件,这样才能取出分析. 首先是日志输出,分为c的printf和标准的NSLog输出,print ...

随机推荐

  1. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是 ...

  2. 配置Hadoop1.2.1

    1.从Apache官网上下载1.2.1,地址:http://apache.dataguru.cn/hadoop/common/2.拷贝文件到虚拟机下(vm9下直接拖拽就可以)3.到Hadoop的目录下 ...

  3. 【svn】解析subversion的使用

    目录结构: contents structure [-] 安装客户端 安装服务端 创建仓库 启动仓库 创建客户端与仓库取得联系 使用svn服务 SVN密码管理 SVN的仓库布局和常规命令 分支.合并和 ...

  4. 【Servlet】Java Serlvet Listener 监听器

    Listener监听器 Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理 容器产生的事件分类 - 生命周期相关的事件 - 设置和删除Attribute数据 ...

  5. java导出txt文件

    1:vm模板页面的代码片段 <div class="col-sm-1"> <button type="button" class=" ...

  6. html5 ajax 文件上传

    http://html5demos.com/dnd-upload 看这个例子看了一会儿...这个是支持拖拽的上传. 下面代码是一个简单的ajax的文件上传: function match(url,rs ...

  7. Docker 学习笔记 ---Docker组件

    Docker组件 1.  客户端:dockerclient 2.  服务端:dockerserver 3.  Docker镜像 4.  Registry 5.  Docker 容器 Docker客户端 ...

  8. .net core下直接执行SQL语句并生成DataTable

    .net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs& ...

  9. Openssl aes加解密例程 更进一步

    原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...

  10. android开发之interpolator的使用

    android:interpolator Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repea ...