C# 开发日志本地化工具
程序员讨厌写文档, 讨厌写注释, 而我还讨厌写日志, 输出一个 "Id=5, 姓名=王大锤, 性别=男, 生日=2020年1月1日" 总归会用到字符串的填充
Json序列化工具多好啊, 可是输出的是
业务部门的人就是看不懂, 毕竟不是人人都有良好的英语基础, 同时我也经常猜不到有人用 DRLS 表示 "当日流水".
其实如果只要稍微把 json 里面的key 用中文替代, 业务部门还是能大概读得懂大部分意思的.
所以我开发了一个工具 LocalizationTools, 协助生成中文日志.
新建一个 Console, 引入 nuget 包: LocalizationTools, 然后定义示例类
记得在生成界面勾上 XML文档文件
使用代码
相信这样的输出, 大部分人也应该能够看懂了
LocalizationTools.ToString() 方法会将 属性名称 替换成注释里的 Summary 信息, 枚举值也同样会进行这样的替换
如果字段很少, 刚才的输出还没什么问题, 如果字段非常多, 读着就眼花缭乱了, 所以我建议还是这行删除
这样输出的内容是
使用Json工具格式化一下
这样即使包含了子对象的对象, 也非常清晰明了了.
这里面的不足是: "是否活着" 这个属性输出的是 true/false, 布尔值在不同的场景可以表示: 是/否、对/错、启用/关闭....... 业务人员可不想自己猜, 解决办法有两个
1. 在ToString()前, 我知道IsAlive是false, 应该用 "否" 来替换
2. 给 IsAlive 属性加上 ToStringReplacePairAttribute, 来替换某些特定的值
LocalizationTools 替换 属性名称 的顺序是 1. DisplayNameAttribute 2. 注释里的summary, 因为有些人喜欢在 summary 中加入其他说明信息, 输出到日志里不好看;
由于 DisplayNameAttribute 不能作用于 enum枚举值, 所以我专门定义了 EnumAliasAttribute, 它的优先级也比 注释里的summary 高
这里特别强调一下, LocalizationTools.ToString() 不是一个Json 序列化工具, 为了使用随处可见的 Json格式化工具, 而将输出调整得像Json, 所以这个工具从来就没有考虑到反序列化功能, 也没有去解决循环引用的问题, 也没有考虑到要符合Json 的标准, 仅仅是一个方便输出中文日志的工具, 也没有追求高性能.
LocalizationTools.ToString() 特别适用于面向数据表的编程, 因为表字段一般都是简单的类型, 输出的日志更为直观.
按理说应该为这个工具提供扩展方法, 但是我有强迫症, 许多类库给 object 加上了各种扩展方法, 让我很不爽, 所以我没有在类库中主动加入扩展方法, 大家可以在自己的项目里加入以下代码, 以提供扩展方法
新增实体的日志解决了, 接下来又有另一个问题, 如何保存实体变化的日志?
最简单的办法就是把 实体类 修改前的json 和 修改后的json 都保存起来, 让业务人员自己去痛苦寻找的变化, 呵呵呵, 只要是个人, 都会抱怨.
让程序员一个字段一个字段的比较, 然后生成日志, 开玩笑! 我干不来这样枯燥的活
nuget 上有 JsonDiffPatch 这样的工具生成 JSON patch, 但输出的结果就不是为人类准备的, 所以我又继续写了 Compare 方法
Json格式化一下
当然你可以对 CompareResult 进行进一步处理, 使用 UpdateDifferentProperty 修改里面的比较结果, 最后再得出比较结果.
以上就是C# 开发日志本地化工具的详细内容,更多关于C# 日志本地化工具的资料请关注得得之家其它相关文章!