log4net在线程中使用问题

易2017 2017-09-25 11:23:29
最近新接触log4net,碰到一个问题
        private void button1_Click_1(object sender, EventArgs e)
{
Thread Thread1 = new Thread(Th1);//盘点线程
Thread1.Start();
LogHelper.WriteLog(typeof(Form1), "1");
}
public void Th1()
{
timer3.Enabled = true;
LogHelper.WriteLog(typeof(Form1), "2");

}

private void timer3_Tick(object sender, EventArgs e)
{
LogHelper.WriteLog(typeof(Form1), "3");
}

可以输出1、2的日志,却无法在计时器中记录日志3,求助大神讲解,这是参考以下文章做的http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html
...全文
287 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
易2017 2017-09-27
  • 打赏
  • 举报
回复
顶上,问题折中解决了,来个大神讲讲log4net相关问题,或者推荐些相关文章
正怒月神 2017-09-25
  • 打赏
  • 举报
回复
发一下你的log4net日志配置。 看一下你的timer是多久触发一次。
易2017 2017-09-25
  • 打赏
  • 举报
回复
之前测试程序写的有点问题,没有在主线程操作timer,现在能执行到,但是还是无法写入日志3
        private void button1_Click_1(object sender, EventArgs e)
        {
            Thread Thread1 = new Thread(Th1);//盘点线程
             Thread1.Start();
             LogHelper.WriteLog(typeof(Form1), "1");
        }

        private delegate void delegate1();
        public void Th1()
        {
            delegate1 d1 = delegate()
            {
                timer3.Enabled = true;
                LogHelper.WriteLog(typeof(Form1), "2");
            };
            this.Invoke(d1);
          
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            LogHelper.WriteLog(typeof(Form1), "3");
        }
    }
正怒月神 2017-09-25
  • 打赏
  • 举报
回复
那会不会是线程
引用 6 楼 qq_38588710 的回复:
现在的问题是语句执行到了,没写进去,但是如果在最后一个线程之前写过日志的话日志就能被写入
那问题应该还是在线程的问题,线程的大多情况可能还是资源争用导致的。 在配置文件中,增加 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />试试看。
易2017 2017-09-25
  • 打赏
  • 举报
回复
现在的问题是语句执行到了,没写进去,但是如果在最后一个线程之前写过日志的话日志就能被写入
正怒月神 2017-09-25
  • 打赏
  • 举报
回复
先不用线程,走一遍看看。 缩小可能出错的范围
易2017 2017-09-25
  • 打赏
  • 举报
回复
 private void button1_Click_1(object sender, EventArgs e)
        {
            Thread Thread1 = new Thread(Th1);
             Thread1.Start();
             LogHelper.WriteLog(typeof(Form1), "1");
        }

        private delegate void delegate1();
        public void Th1()
        {
            while (true)
            {
                delegate1 d1 = delegate()
                {
                    if (timer3.Enabled == false)
                    {
                        timer3.Enabled = true;
                       
                    }
                    LogHelper.WriteLog(typeof(Form1), "2");
                };
                this.Invoke(d1);
                Thread.Sleep(100);
            }
          
          
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            LogHelper.WriteLog(typeof(Form1), "3");
        }
    }
}
现在经过调试,我的测试程序没有问题,实际程序和测试程序结构是一样的,但是我的实际运行的程序存在以下问题: 当不写红色部分的日志记录语句时,第三条语句执行但无法写入日志,这是我现在遇到的主要问题
易2017 2017-09-25
  • 打赏
  • 举报
回复
以下是我的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记录时间:%date  线程ID:[%thread]  日志级别:%-5level  日志类:%logger property %n日志信息:%message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="INFO"/>
      <!--文件形式记录日志-->
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
  </log4net>
</configuration>
以下是日志类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "./log4net.config", ConfigFileExtension = "config", Watch = true)]
namespace TestLog4Net
{
    public class LogHelper
    {
        /// <summary>
        /// 输出日志到Log4Net
        /// </summary>
        /// <param name="t"></param>
        /// <param name="ex"></param>
        #region static void WriteLog(Type t, Exception ex)

        public static void WriteLog(Type t, Exception ex)
        {
            log4net.ILog log = log4net.LogManager.GetLogger(t);
            log.Error("Error", ex);
        }

        #endregion

        /// <summary>
        /// 输出日志到Log4Net
        /// </summary>
        /// <param name="t"></param>
        /// <param name="msg"></param>
        #region static void WriteLog(Type t, string msg)

        public static void WriteLog(Type t, string msg)
        {
            log4net.ILog log = log4net.LogManager.GetLogger(t);
            log.Info(msg);
        }

        #endregion


    }
}

110,534

社区成员

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

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

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