0%

Log4j切换成logback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<slf4j-version>1.7.5</slf4j-version>
<log4j-over-slf4j-version>1.7.5</log4j-over-slf4j-version>
<logback-version>1.1.7</logback-version>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${log4j-over-slf4j-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-version}</version>
</dependency>



<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.home}/logs" />

<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%thread] %cyan(%logger{26}) - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 业务日志 -->
<appender name="business_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/business.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 业务日志 -->
<appender name="run_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/run.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 错误日志 -->
<appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ex/hug-interview-exception.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<!-- 慢sql -->
<appender name="slow_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ex/hug-interview-slowlog.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<logger name="cn.joinhealth.interview.web.root.aspect.ServiceAspect" level="error">
<appender-ref ref="error_log"/>
</logger>
<logger name="com.alibaba.druid.filter.stat.StatFilter" level="ERROR">
<appender-ref ref="slow_log" />
</logger>
<logger name="business" level="INFO">
<appender-ref ref="business_log"/>
</logger>
<logger name="cn.joinhealth.interview" level="INFO">
<appender-ref ref="run_log"/>
</logger>
<logger name="cn.joinhealth.interview.*.*.dao" level="DEBUG">
<appender-ref ref="run_log"/>
</logger>
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

日期 项目 注意事项
9.11 NT、早糖

下次产检日期:

挂号科室:妇科/产科?

产检内容:

注意事项:是否空腹

VisualVM在Java 8中是JDK自带的一个图形化工具,项目主页 VisualVM,在后续版本中可能会从JDK移除。

VisualVM可以监控Java进程的CPU与内存占用情况,可以监控Java进程内的各个线程的执行情况,还可以与MAT工具一样用来分析堆转储快照。

Mac VisualVM路径

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands

监控远程Tomcat进程

监控远程主机上的Tomcat进程,需要在Tomcat的catalina.sh文件中加入参数:

1
JAVA_OPTS="$JAVA_OPTS -Dcom.sum.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPV4Stack=true -Djava.rmi.server.hostname=x.x.x.x"
  • -Dcom.sum.management.jmxremote: 启用JMX远程连接
  • -Dcom.sun.management.jmxremote.port=9004: 设置JMX连接端口
  • -Dcom.sun.management.jmxremote.authenticate: 是否开启用户名密码认证
  • -Dcom.sun.management.jmxremote.ssl: 是否使用SSL连接
  • -Djava.net.preferIPV4Stack: 优先使用IPV4
  • -Djava.rmi.server.hostname: 设置JMX主机IP

打开VisualVM,文件 -> 添加JMX连接,输入刚才设置的IP和端口号:

image-20200908162617992

通过jstatd启动RMI服务

  1. 文件路径**$JAVA_HOME/jre/lib/security/java.policy**,在文件末位的 }; 前添加
1
permission java.security.AllPermission;
  1. 在被监控机器启动
1
2
cd $JAVA_HOME/bin
./jstatd -J-Djava.security.policy=all.policy &

​ 启动后会开启注册端口1099和一个随机的连接端口,注册端口也可通过-p参数指定,如

1
./jstatd -J-Djava.security.policy=all.policy -p 10003 &
  1. 设置防火墙

    除了把1099添加到防火墙规则外,还需要找到另外一个随机端口,也加入到规则中
    执行
    netstat -anp | grep *jstatd

  2. 测试

    启动VisualVM,因为在配置JMX时已经添加过服务器节点,如果配置正确,通常VisualVM会自动检测到jstatd连接并添加节点

    如果没有自动添加,可以检查端口是否能连通并尝试手动添加连接

image-20200908163214196

大概新年新气象吧,大家复工之后都追求一个“新”,不少用户升级到了Chrome 80,然后发现登入成功之后总是重定向回单点登录的统一登录页,然后头秃的我感觉头上更凉了。

定位问题

生产环境出了问题,肯定得赶紧寻找问题根源啊。(三步走路子)

  • 第一步,最先以为cookie失效的问题,于是远程用户,发现浏览器cookie设置正常,域名下cookie也有值,但就是带不过去后台,于是开始怀疑跨域出了问题。
  • 第二步,遂检查Nignx配置,CORS配置正常,那就不是后台的问题,应该是浏览器的锅。
  • 第三步,顺着这条路子,最后发现是Chrome 80版本的一个新特性搞的鬼。

在Chrome 80版本中,Chrome会将没有声明SameSite值的cookie默认设置为SameSite=Lax。只有采用SameSite=None; Secure设置的cookie可以从外部访问,前提是通过安全连接(即HTTPS)访问。

SameSite又是个啥?(T︵T,为啥那么多我不知道的东西),哎,慢慢道来。

阅读全文 »

9.1

  1. 绍兴人民医院投标演示
  2. 测试用例制度及规范
  3. ProcessOn
  4. 禅道

9.2

  1. 中山六院、广妇儿需求排期

    医院 科室 需求 版本/发布日期
    广妇儿 1、表单创建人可停用表单
    2、出院宣教的触发时间点能否改为预出院(电子病历提供接口,患者管理)
    3、四个专科不能融合到一个病区;(sql处理历史数据) – 高翔
    2.3.3b10 / 2020-09-03
    中山六院 干部保健科 1、患者管理新增字段(导出信息没有年龄、就诊科室、门诊/出院诊断、就诊/入院/出院时间)
    2、VIP标记患者背景变红
    3、患者档案增加车牌号及上传图片
    4、嵌入病历记录(需医院提供接口
    5、检验检查异常患者随访(患者管理,需医院提供接口
    6、体检、复诊提醒功能(患者管理,需医院提供接口
    2.3.3b12/2020-09-17
    中山六院 门诊办公室 1、按照年龄、性别、是否首诊、高血压级别、患者科室、入组时间统计 2.3.3b11/2020-09-10
    中山六院 肾内一科 1、已完成页面增加计划随访时间 2.3.3b11/2020-09-10
    中山六院 随访办 1、对接医院原有系统的患者管理,进入随访队列。(患者管理)
    2、调研需求52 – 待定
    3、调研需求53 – 待定
    4、手术接口对接手麻系统(需医院提供接口
    2.3.3b11/2020-09-10
  2. 中山六院、广妇儿 bug

    医院 科室 BUG 截止时间
    广妇儿 1、家长已读却显示未读; – 林剑
    2、蓝牛app偶尔出现患者列表不是本科室患者 – 吴森
    2020-09-03
    中山六院 肾内一科 1、支持由医生自主选择自动填充的检验数据项,例如患者在1号和22号各有一次检验数据,医生可以选择填充1号的检验数据项。
    2、2个报表的查询统计在:随访详情报表和最近一次随访报表(按主管医生和最近一次随访时间倒序排序)
    2020-09-03
  3. 省里同德数据处理 – 已处理

  4. 问题处理要跟踪,要追根究底

  5. 广妇儿jh-hos内存溢出

  6. 省妇保CPU 100%

  7. MQ断线重连 – 张成汉

9.3

  1. 迭代验收

  2. 迭代宣讲

  3. 科研数据库内部讨论

  4. 红房子CPU报警凌晨定时器

    • 同步字典(职工、科室、疾病)
    • 患者管理自动转移分组
    • 同步患者管理APP注册状态
    • 驾驶舱固化数据
  5. 红房子CPU报警内部分析

    原因分析:

    1、不启动dw抽取程序时,内存占用在80%,dw内存限制2G,运行一段时间后会超过85%阈值,触发报警。内存回收不了会导致CPU飙升。

    2、院内驾驶舱凌晨固化数据,sql执行很慢,会占用比较多的资源

    解决办法:

    1、关闭dw程序

    2、优化内存分配

    3、禁用驾驶舱固化数据定时器

    4、优化随访正常发送业务资源占用

9.4

  1. 后段培训
  2. 代码评审
    • lombok
    • 实体类注释/**/
    • save、update 字段加if标签判断
    • 多表查询,字段别名要加
    • 公用方法文档梳理
    • Controller不需要判断DTO是否为null
    • 自动填充条件梳理
    • where 条件非必要不使用函数
    • 是否用isXXX,0否、1是
    • type类型,要定义枚举
    • sql 关键字、方法大写
    • not exists 和 !exists
    • job等方法需要在方法上注释完整逻辑,包括一些隐藏逻辑
    • 一个方法代码不宜过长,可将部分代码封装抽取出来
  3. 周会

9.5

  1. Bug分析会议
  2. CPU线程合理设置,数据库和服务器分开
  3. 下城区小助手代码

9.7

  1. 健管云需求讨论
  2. 9月验收目标9家,研发7家
  3. 远程工具FRP、todesk、向日葵、vnc、screen sharing
  4. 重庆医药二期工作量评估
  5. 重庆医药短信发送失败 – 毛子杰
  6. session、token、JWT

9.8

  1. 单病种数据库开发计划(首页、筛选患者入组–接口、患者档案自动抓取并保存、历史数据导入)

    内容 开始时间 结束时间
    产品设计 2020-09-01 2020-09-10
    UI 2020-09-10 2020-09-11
    表结构设计 2020-09-11 2020-09-14
    接口文档、思维导图 2020-09-15 2020-09-15
    我的科研(除导入) 2020-09-16 2020-09-17
    患者档案配置 2020-09-18 2020-09-18
    我的档案(号码维护、诊疗记录、患者档案) 2020-09-19 2020-09-23
    我的主页 2020-09-24 2020-09-25
    导入、接口入组 2020-09-27 2020-09-30
    测试(除我主页、导入、接口入组) 2020-09-23 2020-09-30
    测试(主页、导入、接口入组) 2020-10-09 2020-10-12
    验收 2020-10-12 2020-10-12
  2. 胃癌专病档案自动抓取

    内容 开始时间 截止时间
    研发 2020-09-08 2020-09-9
    测试 2020-09-10 2020-09-11
  3. 绍兴二院健管云项目一期内容

    • 预约挂号 8人/日
    • 健管云1.4迭代 7人/日
    • 健管云展示优化 1人/日
  4. 省妇保在院宣教发送失败 – 高翔

  5. 线程合理分配

  6. 日志规范(未完成)

9.9

  1. 宿迁第一人民医院 tomcat 闪退,虚拟内存不够
  2. 迭代验收+宣讲
  3. IBD单病种数据库宣讲、计划制定

9.10

  1. 问卷星
  2. 日志规范
  3. 随访问卷答案支持emoj表情(数据库、表、表字段改为utf8mb4、utf8mb4_unicode_ci)
  4. SPSS https://spss.pmstation.com/
  5. 闽东医院 电话盒子(XP不支持高版本chrome)

9.11

  1. cdr数据抽取问题(上海红房子、厦门中山、绍兴二院)
  2. 分享会 – 打开你的思维边界
    • 复盘
    • 博弈论
    • 金字塔原理–结论先行、论点在后
    • 倾听、决策、交流
    • 彻底坦诚
    • 确认偏误
    • 升维打击、降维打击

9.15

  1. 单病种数据库表结构
    • 档案id命名,档案关联课题/课题分组
    • 一个患者属于多个分组怎么存储
    • 编码统一使用utf8mb4
    • sex_code tinyint
    • 业务记录表什么用途
    • patient表寸的字段过少:来源、科室、主治医生等
    • 首页统计
  2. 单病种数据库–产品
    • 权限控制
    • 启用/停用/删除等操作逻辑
  3. 统计中心–点击进入后默认不加载
    • 随访工作量统计–按患者科室统计/按科室随访任务统计/按个人随访统计/按随访方式统计
    • 随访表单统计–表单汇总统计/表单单题统计/按单题统计
    • 满意度调查统计–按患者统计/按表单统计/按单题统计/按表单单题统计
  4. 慈溪妇幼获取不到数据库连接数–满意度回收控制事务未提交导致

9.16

  1. 江苏省人民连接数不够
  2. 嵊州人民医院工作量评估
模块 内容 工时
医生端 用户体系对接,任务页面,处理页面 25人/日
患者端 随访记录、发送、表单填写 15人/日
数据回传 随访结果、表单答案回传 5人/日

9.17

  1. 赣州人民医院询价

9.18

本周进度

  1. Ibd单病种开发进度:按计划进行中,目前进度我的科研对接完成
  2. 技术优化:1、线程池合理配置优化,解决CPU暴增问题。2、院级随访、满意度数据历史迁移存储过程(本地已测试,待发布)

下周安排:

  1. 日志规范制定、日志按模块输出
  2. 院内dubbo改为http交互
  3. Ibd单病种数据库:除导入外全部提测

9.19

  1. IBD单病种数据库测试用例评审
  2. dubbo改为nacos(无法集成到spring)

9.22

  1. 面试–2人
  2. dubbo改为nacos(服务注册成功,调用OK,待整体联调)

9.23

  1. 首页截图、满意度报告截图
  2. 迭代宣讲
  3. 迭代2.3验收

9.24

  1. 云端模式、调用esb改为nacos
  2. 邵逸夫二维码满意度科室处理(定时器)
  3. 南阳第一打电话打不了(谷歌浏览器电话盒子模式 callType 6)2.50b16不行,2.5.0b13可以

9.25

  1. 平阳二院售前
    • BI 公立医院绩效考核
  2. 随访硬件方案

9.26

  1. 瑞金随访崩溃(疑似短信发送导致),优化
  2. 邵逸夫二维码满意度病区处理
  3. 演示环境造数据
  4. 硬件方案
  5. 工作量评估

9.27

  1. nacos config
  2. log4j切换成logback
  3. 医共体接口文档(委托/被委托列表页面第三方嵌入)
  4. 广妇儿自助报道未推送问题排查(9.19号之后就没有推送记录了,推测是服务关了)
  5. 武汉中心医院无法新建表单(配置问题)
  6. 接口实时性要求
    • 门诊/住院记录,场景:诊间嵌入发送表单/宣教页面,在院宣教
    • 门诊诊断/住院诊断/处方/处方明细,场景:按药品、疾病筛选
    • (剩余号源,预约记录)预约挂号相关,场景:需要实时查询好源信息,预约记录
    • 付费患者(健管云开单)

9.28

类型 数量/占比 措施
bug 33 23% 代码评审,验收
不是bug 30 21% 操作手册,加强培训
操作问题 13 9% 操作手册,加强培训
环境问题(配置/网络) 13 9% 优化部署/配置,长连接 改短连接
数据问题 14 10% 增加操作记录,便于追溯
已修复bug 11 8% 及时查看FTP补丁包
优化/需求 15 11% 转产品评估
性能问题/疑难杂症 3 2%
其他(待确认/未分类/接口bug) 9 6%
  1. 投标演示,打电话
  2. ibd初步验收
  3. 迭代2.5发包
  4. 研发质量控制