Windows Service添加日志 Logger

Windows Service Logger日志文件配置:
首先,添加程序包log4net
在这里插入图片描述
配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <connectionStrings>
      //这个地方用于配置连接数据库字符串,如:
     // <add name="shj_webEntities" connectionString="metadata=res://*/Dao.DataBase.csdl|res://*/Dao.DataBase.ssdl|res://*/Dao.DataBase.msl;provider=System.Data.SqlClient;provider connection string=&quot;     data source=.;initial catalog=shj_web_test;user id=sa;Password=123qwe!@#;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>
  </connectionStrings>
  <log4net>
    <appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="Logs/Errors/Error-" />
      <datePattern value="yyyy-MM-dd'.log'" />
      <staticLogFileName value="false" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="5MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [NDC:%ndc] - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="Logs/Log-" />
      <datePattern value="yyyy-MM-dd'.log'" />
      <staticLogFileName value="false" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="5MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [NDC:%ndc] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <!--文件形式记录日志-->
      <appender-ref ref="RollingFileAppender" />
    </root>
    <logger name="ErrorLogger">
      <level value="ERROR" />
      <appender-ref ref="ErrorFileAppender" />
    </logger>
    <logger name="InfoLogger">
      <level value="All" />
      <appender-ref ref="RollingFileAppender" />
    </logger>
  </log4net>
  <appSettings>
	  //这个地方主要配置一些键值,不需要则不用写
    <add key="SleepTime" value="5"/>
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.0.246" newVersion="1.2.0.246" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

配置文件写好以后,此时还不能生成日志文件,需要在主程序进入的地方加一句:

var l4ncfg = log4net.Config.XmlConfigurator.Configure();

现在,可以打印日志文件了。

Logger.Write("测试日志文件打出!");

Logger.cs


    /// <summary>
    /// Logger work with log4net.Error().
    /// </summary>
    public static class Logger
    {
        /// <summary>
        /// Get Logger by type.
        /// </summary>
        /// <param name="type">Impl Type</param>
        /// <param name="defaultLogger">Default Logger if got no logger by type, default is InfoLogger</param>
        /// <param name="logModule">Log module name, default is "common"</param>
        /// <returns>ILog</returns>
        public static ILog GetLogger(Type type = null, string defaultLogger = "InfoLogger", string logModule = "")
        {
            ILog logger;
            if (type == null)
            {
                logger = LogManager.GetLogger(defaultLogger);
            }
            else
            {
                logger = LogManager.GetLogger(type);
            }
            if (logger == null)
            {
                logger = LogManager.GetLogger(System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType);
            }
            //log4net.LogicalThreadContext.Properties["logModule"] = logModule;
            //log4net.Config.XmlConfigurator.Configure();
            return logger;
        }

        /// <summary>
        /// Write Exception
        /// </summary>
        /// <param name="ex">Exception</param>
        public static void Write(Exception ex)
        {
            var log = GetLogger(defaultLogger: "ErrorLogger");
            log.Error("Error", ex);
        }

        /// <summary>
        /// Write Exception with definition type.
        /// </summary>
        /// <param name="t">Definition type</param>
        /// <param name="ex">Exception</param>
        public static void Write(Type t, Exception ex)
        {
            var log = GetLogger(t, "ErrorLogger");
            log.Error("Error", ex);
        }

        /// <summary>
        /// Write message.
        /// </summary>
        /// <param name="message">Message</param>
        public static void Write(string message)
        {
            var log = GetLogger();
            log.Info(message);
        }

        /// <summary>
        /// Write message with definition type.
        /// </summary>
        /// <param name="t">Definition type</param>
        /// <param name="message">Message</param>
        public static void Write(Type t, string message)
        {
            var log = GetLogger(t);
            log.Info(message);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您添加日志轮换功能。首先,我需要在 `Logger` 类中添加一个 `rotating_file_sink` 对象,并将其作为 sink 传递给 logger 对象。然后,我需要设置日志文件的最大大小和最大文件数,以控制日志轮换的行为。 以下是更新后的 `Logger` 类代码: ```c++ #include <spdlog/spdlog.h> #include <spdlog/sinks/basic_file_sink.h> #include <spdlog/sinks/stdout_color_sinks.h> #include <spdlog/sinks/rotating_file_sink.h> class Logger { public: Logger() { // 创建控制台输出 sink auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>(); // 创建文件输出 sink auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("log.txt", 1024 * 1024 * 50, 3); // 创建 logger logger_ = std::make_shared<spdlog::logger>("my_logger", spdlog::sinks_init_list{console_sink, file_sink}); // 设置日志级别 logger_->set_level(spdlog::level::trace); } void log(const char* file, int line, spdlog::level::level_enum level, const std::string& msg) { // 根据日志级别选择不同的颜色 switch (level) { case spdlog::level::trace: logger_->trace("{}:{} - {}", file, line, msg); break; case spdlog::level::debug: logger_->debug("{}:{} - {}", file, line, msg); break; case spdlog::level::info: logger_->info("{}:{} - {}", file, line, msg); break; case spdlog::level::warn: logger_->warn("{}:{} - {}", file, line, msg); break; case spdlog::level::err: logger_->error("{}:{} - {}", file, line, msg); break; case spdlog::level::critical: logger_->critical("{}:{} - {}", file, line, msg); break; default: break; } } private: std::shared_ptr<spdlog::logger> logger_; }; int main() { // 初始化 logger Logger logger; // 打印日志 for (int i = 0; i < 100000; ++i) { logger.log(__FILE__, __LINE__, spdlog::level::info, "Hello, world!"); } return 0; } ``` 在上述示例中,我使用 `rotating_file_sink_mt` 创建了一个支持日志轮换的文件输出 sink。其中,第一个参数是日志文件名,第二个参数是单个日志文件的最大大小(这里设置为 50MB),第三个参数是最大的日志文件数(这里设置为 3)。这意味着,当一个日志文件达到 50MB 时,会自动创建一个新的日志文件,最多会保留 3 个日志文件(包括当前日志文件)。如果您需要自定义日志轮换行为,可以参考 spdlog 提供的其他 sink,并根据自己的需求进行修改。 现在,在程序运行时,如果日志文件大小达到 50MB,或者超过 3 个日志文件时,会自动按照一定的规则进行日志轮换,保证日志文件不会过大,也不会占用过多的磁盘空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值