c# 从0实现一个温湿度监测的小工具 (5)

474 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

经过之前的文章,我们实现了一个极简功能的温湿度监测小工具。那么对于后续功能的增加,首先我们需要打好软件的基础。之前在我们的软件中,日志均已messagebox的方式提示用户。如果真的到了生产环境,这种方式不利于我们后期去对软件追踪。 那么我们需要是实现的就是增加一个日志功能。

本文主要从以下两个方面入手:

  • 修改页面,增加工具栏
  • 增加NLog日志记录功能。

1.修改页面,增加工具栏

点击工具箱,搜索menu,拖一个menustrip到界面

image.png

完成后,修改以下背景颜色,界面如图:

image.png

黄色部分就是我们新增的工具栏,双击工具栏位置,新增一个按钮叫做日志,增加完毕后,双击日志按钮,增加一个点击回调事件。form1.cs中会自动生成一个回调,如下:

        private void 日志ToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

ok,界面修改完毕。

2.增加日志工具NLog

2.1 安装扩展

点击vs的工具,选择nuget包管理。搜索nlog,安装nlog和nlogconfig扩展包

image.png

安装完毕,我们会在项目中看到一个nlog.config的文件

image.png

2.2 增加日志类

新增一个日志类,叫做mylogger.cs,实现如下:

using NLog;
using System;

namespace THSensor
{
    class MyLogger
    {
        /// <summary>
        /// 实例化nLog,即为获取配置文件相关信息(获取以当前正在初始化的类命名的记录器)
        /// </summary>
        private readonly NLog.Logger _logger = LogManager.GetCurrentClassLogger();

        private static MyLogger _obj;

        public static MyLogger _
        {
            get => _obj ?? (new MyLogger());
            set => _obj = value;
        }

        #region Debug,调试
        public void Debug(string msg)
        {
#if DEBUG
            Console.WriteLine(msg);
#endif
            _logger.Debug("Debug: \r\n" + msg);
        }

        public void Debug(string msg, Exception err)
        {
            _logger.Debug(err, msg);
        }
        #endregion

        #region Info,信息
        public void Info(string msg)
        {
#if DEBUG
            Console.WriteLine(msg);
#endif
            _logger.Info("Info: \r\n" + msg);
        }

        public void Info(string msg, Exception err)
        {
            _logger.Info(err, msg);
        }
        #endregion

        #region Warn,警告
        public void Warn(string msg)
        {
            _logger.Warn(msg);
        }

        public void Warn(string msg, Exception err)
        {
            _logger.Warn(err, msg);
        }
        #endregion

        #region Trace,追踪
        public void Trace(string msg)
        {
            _logger.Trace(msg);
        }

        public void Trace(string msg, Exception err)
        {
            _logger.Trace(err, msg);
        }
        #endregion

        #region Error,错误
        public void Error(string msg)
        {
#if DEBUG
            Console.WriteLine(msg);
#endif
            _logger.Error("Error: \r\n" + msg);
        }

        public void Error(string msg, Exception err)
        {
            _logger.Error(err, msg);
        }
        #endregion

        #region Fatal,致命错误
        public void Fatal(string msg)
        {
            _logger.Fatal(msg);
        }

        public void Fatal(string msg, Exception err)
        {
            _logger.Fatal(err, msg);
        }
        #endregion
    }
}

2.3 修改nlogconfg文件

制定输出目录,配置文件修改可以参考如下配置:
fileName="basedir/logs/{basedir}/logs/{date:format=yyyy-MM}/${shortdate}.log"表示log位置是base目录下的logs目录下的日期(月)目录下的日期.log文件

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <!--
  <variable name="myvar" value="myvalue"/>
    -->
  <variable name="fileFormat"
            value="${date}
                   ${newline}${message}
                   ${newline}[stacktrace]: ${stacktrace}
                   ${newline}------------------------------------------------------------" />

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>

    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->

    <target name="file" xsi:type="File"
          fileName="${basedir}/logs/${date:format=yyyy-MM}/${shortdate}.log"
          layout="${fileFormat}"
          maxArchiveFiles="5"
          archiveAboveSize="1024000" />

  </targets>

  <rules>
    <!-- add your logging rules here -->

    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->

    <!--
        Level    Example
        Fatal    Highest level: important stuff down
        Error    For example application crashes / exceptions.
        Warn    Incorrect behavior but the application can continue
        Info    Normal behavior like mail sent, user updated profile etc.
        Debug    Executed queries, user authenticated, session expired
        Trace    Begin method X, end method X etc
    -->
    <!--
        Logging 水平分为以下等级“Trace<<Debug<<Info<<Warn<<Error<<Fatal ”,如果我们选择Info值,则Trace和Debug等级的信息不会被输出。
    -->
    <logger name="*" minlevel="Trace" writeTo="file"/>
  </rules>
</nlog>

2.4 增加一个启动日志

我们在form1.cs中的load函数中,增加一句日志输出

MyLogger._.Debug("程序启动");

2.5 启动测试

可以看到,我们制定的目录下已经生成了log日志

image.png 内容如下:

image.png

日志的格式,满足我们在nlog.config中配置的格式

  <variable name="fileFormat"
            value="${date}
                   ${newline}${message}
                   ${newline}[stacktrace]: ${stacktrace}
                   ${newline}------------------------------------------------------------" />

第一行是日期,第二行是message,第三行是调用路径,然后分割线。

3. 实现日志按钮回调

日志按钮回调的主要功能就是,打开我们刚才保存的log位置的log文件。用默认的notpad打开
直接上代码:

        /// <summary>
        /// 日志打开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 日志ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string date = DateTime.Now.ToString("yyyy-MM");
            //默认配置文件地址
            string basedir = $"{AppDomain.CurrentDomain.BaseDirectory}logs\\{date}\\";
            //MessageBox.Show(basedir);
            //打开对话框
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = basedir;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    string file = ofd.FileName;
                    System.Diagnostics.Process.Start("notepad.exe", file);
                }
                catch
                {
                    MessageBox.Show("打开日志失败,系统中没找到记事本程序");
                }
            }
        }

测试:

image.png

点击日志,然后会弹出文件选择窗口,直接定位到我们的日志目录。 选择文件后,点击打开。

image.png

调用notepad.exe打开日志文件。 至此,软件的日志功能增加完毕。

下一章节,我们将对软件进行修改。增加对sqlite数据的支持。