C# 日志输出

AOHMYGOD 2016-06-16 03:08:01
有个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里面 另外怎么输出到一个文本框呢?
...全文
813 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2016-06-17
  • 打赏
  • 举报
回复
不好意思看错了,sp1234是正解
衣舞晨风 2016-06-17
  • 打赏
  • 举报
回复
C# 使用Log4Net记录日志(基础篇) http://blog.csdn.net/jiankunking/article/details/43971475 C# 使用Log4Net记录日志(进阶篇) http://blog.csdn.net/jiankunking/article/details/49583165
threenewbee 2016-06-16
  • 打赏
  • 举报
回复
你用的是什么框架呢
sp1234_maJia 2016-06-16
  • 打赏
  • 举报
回复
上面的最后两个 tmr 处理写错了,应该注销事件然后才注册新的事件,并且最后应该Stop一下。
        private static void 测试2(object sender, ElapsedEventArgs e)
        {
            tmr.Stop();
            L1.Log("这是从tmr中执行的。");
            L3.Log("这是从tmr中执行的。");
            tmr.Interval = 1000;
            tmr.Elapsed -= 测试2;
            tmr.Elapsed += 测试3;
            tmr.Start();
        }
 
        private static void 测试3(object sender, ElapsedEventArgs e)
        {
            tmr.Stop();
            L1.Log("这是从ThreadPool中执行的。");
            L2.Log("这是从ThreadPool中执行的。");           
            //如果还有测试4,那么这里应该把测试3也实现注销掉。
        }
  • 打赏
  • 举报
回复
在测试1中,它实际测试了一下 L1。且向系统线程池注册了3个测试任务。同时定时在1秒之后启动“测试2”。 在测试2中,它测试了 L1、L3可运行。并且定时在1秒钟后启动“测试3”。 而测试2与测试3执行过程中,有可能就跟测试1向系统线程池注册的任务并发执行。这可以简单测试并发的能力。
  • 打赏
  • 举报
回复
两个连续的 \r\n\r\n 作为日志的分隔符 确切地说,其实是三个 \r\n。
  • 打赏
  • 举报
回复
可以自己写一个简单的日志。用两个连续的 \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中执行的。");
        }
    }
}
AOHMYGOD 2016-06-16
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
http://blog.csdn.net/zfrong/article/details/4132017 指定filter
搞定不了,我想把日志在texbox里面输出显示,怎么办呢?
AOHMYGOD 2016-06-16
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
http://blog.csdn.net/zfrong/article/details/4132017
指定filter
谢谢,我试试怎么输出到textbox里面,搞不好一会再来问你
  • 打赏
  • 举报
回复
没用过log4net,我就觉得写个日志还要用组件干嘛?自己写下不就完了嘛

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧