首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不使用动态创建的log4net托管Colored控制台

不使用动态创建的log4net托管Colored控制台
EN

Stack Overflow用户
提问于 2021-12-17 19:45:54
回答 1查看 126关注 0票数 1

我有一个程序,它有一个不同的模块集,称为基于输入参数。像订单,发货,定价等模块。我写了一个日志类,log4net是基础,尽管也需要一些定制的日志记录。我想要的是让每个模块都有自己的日志文件,到目前为止,我能够让log4net为每个文件动态创建附加程序。

我还能够获得控制台显示的时间,当它可能是手动运行,但我失去了(并且不知道如何使它工作是彩色控制台附录。我找到了用于创建追加器的基本解决方案这里,然后我使用此链接来研究如何创建控制台和ManagedColoredConsole追加程序,但是当它仍然写入控制台时,我没有得到颜色。

有东西不见了,但我不知道是什么。我编写了一个小测试程序来尝试解决这个问题,这就是日志类:

代码语言:javascript
运行
复制
using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using System;
using System.Linq;

namespace TestLogging
{
    public class Logging
    {

        // Since the current version of logging will require more custom fields passed into the logging table
        // I'm going to set up a wrapper around the log for net processing. This should simplify the way we call it in 
        // the main program sections so we don't have to keep adding constants like pid and we can deal with variables 
        // like item, order number, shipping numbers

        public static ILog log = null;

        public string transType = "";
        public string pid = "0";
        private string logModule = "main";
        private string path = "";

        public Logging(string LogModule)
        {
            logModule = LogModule;    // set up to default to main then pass in the specific log file name for log4net

            SetLevel("Log4net.MainForm", "ALL");
            path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            string execPath = AppDomain.CurrentDomain.BaseDirectory;

            if (log.Logger.Repository.GetAppenders().Count() == 0)
            {
                //CreateConsoleAppender();
                CreateManagedColorConsoleAppender();
            }

            AddAppender(LogModule, CreateFileAppender(logModule, execPath + "\\logs\\" + logModule + ".log"));

        }
        public void Info(string message, string sohnum = null, string itmref = null, string sdhnum = null, double processtime = 0.0)
        {
            setCustom(sohnum, itmref, sdhnum, processtime);
            log.Info(message);
        }
        private void setCustom(string sohnum = null, string itmref = null, string sdhnum = null, double processtime = 0.0)
        {
            log4net.ThreadContext.Properties["TransType"] = transType;

            log4net.ThreadContext.Properties["sohnum_0"] = sohnum;
            log4net.ThreadContext.Properties["itmref_0"] = itmref;
            log4net.ThreadContext.Properties["sdhnum_0"] = sdhnum;
            log4net.ThreadContext.Properties["processtime"] = processtime.ToString();
            log4net.ThreadContext.Properties["pid"] = pid;

        }
        // Set the level for a named logger
        public static void SetLevel(string loggerName, string levelName)
        {
            log = LogManager.GetLogger(loggerName);
            Logger l = (Logger)log.Logger;

            l.Level = l.Hierarchy.LevelMap[levelName];
        }

        // Add an appender to a logger
        public static void AddAppender(string loggerName, IAppender appender)
        {
            log = LogManager.GetLogger(loggerName);
            Logger l = (Logger)log.Logger;

            l.Repository.Configured = true;
            l.AddAppender(appender);
        }

        // Create a new file appender
        public static IAppender CreateFileAppender(string name, string fileName)
        {
            FileAppender appender = new
                FileAppender();
            appender.Name = name;
            appender.File = fileName;
            appender.AppendToFile = true;

            PatternLayout layout = new PatternLayout();
            layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n";
            layout.ActivateOptions();

            appender.Layout = layout;
            appender.ActivateOptions();

            return appender;
        }
        public static IAppender CreateConsoleAppender()
        {
            ConsoleAppender appender = new ConsoleAppender();
            appender.Name = "console";

            PatternLayout layout = new PatternLayout();
            layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n";
            layout.ActivateOptions();

            appender.Layout = layout;
            appender.ActivateOptions();

            var hierarchy = (Hierarchy)LogManager.GetRepository();

            hierarchy.Configured = true;

            hierarchy.Root.AddAppender(appender);


            return appender;
        }
        public static IAppender CreateManagedColorConsoleAppender()
        {

            ManagedColoredConsoleAppender appender = new ManagedColoredConsoleAppender();
            ManagedColoredConsoleAppender.LevelColors mapping = new ManagedColoredConsoleAppender.LevelColors();

            appender.Name = "ManagedColoredConsoleAppender";
            mapping.Level = log4net.Core.Level.Debug;
            mapping.ForeColor = ConsoleColor.Blue;
            appender.AddMapping(mapping);
            mapping.Level = log4net.Core.Level.Info;
            mapping.ForeColor = ConsoleColor.Green;
            appender.AddMapping(mapping);
            mapping.Level = log4net.Core.Level.Error;
            mapping.ForeColor = ConsoleColor.Yellow;
            appender.AddMapping(mapping);
            mapping.Level = log4net.Core.Level.Fatal;
            mapping.ForeColor = ConsoleColor.Red;
            appender.AddMapping(mapping);

            PatternLayout layout = new PatternLayout();
            layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n";
            layout.ActivateOptions();

            appender.Layout = layout;
            appender.ActivateOptions();


            var hierarchy = (Hierarchy)LogManager.GetRepository();

            hierarchy.Root.AddAppender(appender);
            hierarchy.Configured = true;
            hierarchy.Root.Level = log4net.Core.Level.Info;
            
            return appender;

        }
    }
}

它是粗糙的,但这只是为了测试和学习。

这是主要节目:

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestLogging
{
    public class Program
    {
        //private Logging logging = new Logging("file");
        private static Logging logit = new Logging("main");

        static void Main(string[] args)
        {

            logit.Info("This is the main program");

            ordersClass orders = new ordersClass();
            orders.callMe();
            shipments shipit = new shipments();
            shipit.shipMe();

        }
    }
}

以及写入不同日志文件的类之一:

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestLogging
{
    public class ordersClass
    {
        private Logging logit = new Logging("orders");
        public void callMe()
        {
            logit.Info("Just placed an order");
        }
    }
}

当我设置一个断点来查看日志对象时,我可以看到托管颜色作为根附录存在,而其他在第一次创建时添加的颜色。关于以编程方式使用log4net并没有太多的信息,但我希望有人能做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2021-12-17 19:45:54

当我更多地阅读时,我发现了如何打开log4net的内部日志记录。把它放在app.config文件中,是的,这很有帮助,因为它向我展示了如何解决我的问题,尽管它不能动态地工作仍然暗示着我。

代码语言:javascript
运行
复制
<appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

我发现了几件事:

如果您是以编程方式设置的话,Log4net不需要配置文件来工作。因为我没有将“复制到输出目录”设置为“不要复制”,所以没有将配置文件放在exe文件夹中。这显示了您不需要配置文件来进行日志记录,但它仍然没有回答为什么没有颜色。

如果您决定使用一个配置文件,但不要放入根中引用的附录,log4net会记录错误,但仍然工作。我有这个

代码语言:javascript
运行
复制
<appender-ref ref="ManagedColoredConsoleAppender" />

但文件里没有附录。我添加了ManagedColorConsole附录,现在我获得了彩色控制台消息和登录到多个文件。这是一个解决方案,但没有解释为什么我可以动态添加颜色附录,但不能让它工作。如果有答案,请发邮件。同时,这是一个已解决的问题。

代码语言:javascript
运行
复制
<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="ManagedColoredConsoleAppender" />
  </root>
  <appender name="ManagedColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    <mapping>
      <level value="INFO" />
      <foreColor value="Green, HighIntensity" />
    </mapping>
    <mapping>
      <level value="DEBUG" />
      <foreColor value="Green" />
    </mapping>
    <mapping>
      <level value="ERROR" />
      <foreColor value="Yellow, HighIntensity" />
    </mapping>
    <mapping>
      <level value="FATAL" />
      <foreColor value="Red, HighIntensity" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70398210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档