C# 日志输出

.Net技术 码拜 4年前 (2016-02-29) 311次浏览
有个winfrom程序,本人现在需要将ERRO信息写入日志存一个“ERRORLOG”的文件夹下,把一般信息写入日志存在“INFOLOG”的文件夹,怎么去配置或调用呢?本人用的(Log4Net)本人配置了,发现会同时写入两个文件夹的日志里。

	<log4net>
		<!--定义输出到文件中-->
		<appender name="RollingErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
			<!--定义文件存放位置-->
			<file value="error_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行号:%line%n描述:%message%newline %n"/>
			</layout>
		</appender>
		<!--定义输出到文件中-->
		<appender name="RollingInfoLogFileAppender" type="log4net.Appender.RollingFileAppender">
			<!--定义文件存放位置-->
			<file value="info_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行号:%line%n描述:%message%newline %n"/>
			</layout>
		</appender>
		<root>
			<level value="ERROR"/>
			<level value="INFO"/>
			<!--文件形式记录日志-->
			<appender-ref ref="RollingErrorLogFileAppender"/>
			<appender-ref ref="RollingInfoLogFileAppender"/>
		</root>
	</log4net>

Loghelper类:

 public class LogHelper
    {
        /// <summary>
        /// 输出日志到Log4Net
        /// </summary>
        /// <param name="t"></param>
        /// <param name="ex"></param>
        public static void WriteErrorLog(Type t, Exception ex)
        {
            log4net.ILog log = log4net.LogManager.GetLogger(t);
            log.Error("Error", ex);
        }
        /// <summary>
        /// 输出日志到Log4Net
        /// </summary>
        /// <param name="t"></param>
        /// <param name="msg"></param> 
        public static void WriteInfoLog(Type t, string msg)
        {
            log4net.ILog log = log4net.LogManager.GetLogger(t);
            log.Info(msg);
        }
    }

下面是调用:

try
            {
                var z = dailysendpart_service.DailySendhandle(DS_Pxmlstring);
                LogHelper.WriteInfoLog(typeof(FormMain), z);
                var y = partssend_service.PartSendhandle(PS_xmlstring);
                LogHelper.WriteInfoLog(typeof(FormMain), y);
                var x = warehousereceive_service.WarehouseReceivehandle(WR_xmlstring);
                LogHelper.WriteInfoLog(typeof(FormMain), x);
                tbx_Msg.Text = z + "\r\n" + y + "\r\n" + x;
            }
            catch (Exception ex)
            {
                LogHelper.WriteErrorLog(typeof(FormMain),ex);
            }

结果发现INFO在两个日志里面都有,本人希望是info级别的日志在infolog里面Error级别的日志在errorlog里面 另外怎么输出到一个文本框呢?

解决方案

17

30

可以本人写一个简单的日志。用两个连续的 \r\n\r\n 作为日志的分隔符。

    public class 本人的日志
    {
        private FileInfo logFile;
        public 本人的日志(string filename)
        {
            logFile = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "日志", filename + ".txt"));
            var dir = logFile.Directory;
            if (!dir.Exists)
                dir.Create();
        }
        public void Log(string message)
        {
            var content = new StringBuilder();
            content.AppendLine(DateTime.Now.ToShortDateString());
            content.AppendLine(message);
            content.AppendLine();
            content.AppendLine();
            var str = content.ToString();
            lock (logFile)
                File.AppendAllText(logFile.FullName, str);
        }
    }

你可以运行这样一个测试

using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Timers;
namespace ConsoleApplication1
{
    class Program
    {
        static System.Timers.Timer tmr = new System.Timers.Timer();
        static 本人的日志 L1 = new 本人的日志("log1");
        static 本人的日志 L2 = new 本人的日志("log2");
        static 本人的日志 L3 = new 本人的日志("log3");
        static void Main(string[] args)
        {
            测试1();
            Console.WriteLine("..............按任意键结束");
            Console.ReadKey();
        }
        private static void 测试1()
        {
            L1.Log("测试1。你好!");
            tmr.Interval = 1000;
            tmr.Elapsed += 测试2;
            tmr.Start();
            ThreadPool.QueueUserWorkItem(h =>
            {
                Thread.Sleep(1000);
                L1.Log("这是从ThreadPool中执行的_1。");
            });
            ThreadPool.QueueUserWorkItem(h =>
            {
                Thread.Sleep(1000);
                L1.Log("这是从ThreadPool中执行的_2。");
                L3.Log("这是从ThreadPool中执行的。");
            });
            ThreadPool.QueueUserWorkItem(h =>
            {
                Thread.Sleep(2000);
                L1.Log("这是从ThreadPool中执行的。");
                L2.Log("这是从ThreadPool中执行的。");
            });
        }
        private static void 测试2(object sender, ElapsedEventArgs e)
        {
            tmr.Stop();
            L1.Log("这是从tmr中执行的。");
            L3.Log("这是从tmr中执行的。");
            tmr.Interval = 1000;
            tmr.Elapsed += 测试3;
            tmr.Start();
        }
        private static void 测试3(object sender, ElapsedEventArgs e)
        {
            L1.Log("这是从ThreadPool中执行的。");
            L2.Log("这是从ThreadPool中执行的。");
        }
    }
}

1

不好意思看错了,sp1234是正解

1

C# 使用Log4Net记录日志(基础篇)
http://blog.csdn.net/jiankunking/article/details/43971475
C# 使用Log4Net记录日志(进阶篇)
http://blog.csdn.net/jiankunking/article/details/49583165

1


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 日志输出
喜欢 (0)
[1034331897@qq.com]
分享 (0)