(八)日志与系统配置管理

1.Nlog

1.1 简介

image

NLog是一个基于.NET平台编写的日志记录类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。

官网地址:https://nlog-project.org/
文档地址:https://github.com/NLog/NLog/wiki
怎么配置

1.2 配置

配置文件

<?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" >
	<targets>
		<!--输出目标:name名称f,xsi:type输出类型文件, fileName输出到程序根目录logs文件夹中, 以日期作为生成log文件名称, layout生成内容的格式-->
		<target name="f"
				xsi:type="File"
				fileName="${basedir}/logs/${shortdate}.log"
				layout="${longdate} ${uppercase:${level}} ${message}" />
	</targets>
	<rules>
		<!--日志路由规则:最低级别Debug,输出到target目标f-->
		<logger name="*" minlevel="Debug" writeTo="f" />
	</rules>
</nlog>

而且需要复制到输出目录
image

1.3 静态类

image
在app中添加不同的日志回调函数
image

1.4 测试

image
image

使用,可以在抛出异常时记录
image

2.创建prism对话框viewmodel基类

  • 继承IDialogAware
    image

3. 创建系统配置模块

有一些系统设置参数需要保存到json,xml等文件中

  • 用户控件库

  • 包:prism unity,reactiveui.wpf ,reactiveui.fody

  • 引用
    image

  • 模块配置
    image

  • 生成配置
    image

  • 在硬件加载初始化之前就应该读到硬件的设置参数,在 初始化硬件的时候就把参数填入配置了,所以初始化模块依赖于配置模块
    image

  • 创建views viewmodels
    image

4.系统配置模块的业务逻辑

  • 在菜单页面添加命令,点击系统设置,弹出对话框
    image
  • 对应viewmodel
    image
  • 回来注册对话框页面
    image

5.json的序列号和反序列化

  • 安装包
    image
/// <summary>
/// JSON文件的序列化和反序列化帮助类
/// </summary>
public static class JsonHelper
{
    /// <summary>
    ///  加载某个JSON文件并返回指定的类型实例     反序列化过程
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static T Load<T>(string fileName)
    {
        if (!File.Exists(fileName))
        {
            return default(T);
        }

        string content=File.ReadAllText(fileName);
        return Deserialize<T>(content);
    }

    private static T Deserialize<T>(string content)
    {
        return JsonConvert.DeserializeObject<T>(content);
    }
    /// <summary>
    /// 将指定的类型实例保存位JSON文件
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="fileName"></param>
    /// <param name="indented"></param>
    public static void Save(object obj,string fileName,bool indented=false)//缩进
    {
        string content = Serialize(obj, indented);
    }

    private static string Serialize(object obj, bool indented)
    {
        Formatting formatting = indented ? Formatting.Indented : Formatting.None;
        return JsonConvert.SerializeObject(obj,formatting);
    }
}

6.系统配置管理器

  • 创建枚举类,因为配置文件有不同的类型,给他们设置键名
    image
  • 编写接口:一个读方法,一个写方法
    image
  • 编写实现类,标注ExposedService会自动创建实例
//表示根目录文件夹Config
private const string root = "Config";
/// <summary>
/// 获取当前JSON文件的完整路径
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private string GetFullPath(ValueType key)
{
    return Path.Combine(root,key.GetType().FullName+key.ToString()+".json");
}
/// <summary>
/// 读配置文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T Read<T>(ValueType key)
{
    string fileName=GetFullPath(key);
    return JsonHelper.Load<T>(fileName);
}
/// <summary>
/// 写配置文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
public void Write<T>(ValueType key, T value)
{
    Assert.NotNull(value);
    Assert.NotNull(key);
    Directory.CreateDirectory(root);//创建根目录
    string fileName = GetFullPath(key);
    JsonHelper.Save(value, fileName, true);
}
posted @ 2023-12-13 09:05  huihui不会写代码  阅读(67)  评论(0)    收藏  举报