日志功能
前言
为了 避免到时候自己来看这个项目的时候看不懂,还是记录一下各个功能板块代码具体实现的思想
日志代码
日志的重要性:供日后运行维护人员去查看、定位和解决问题;
新文件:ngx_printf.cxx以及ngx_log.cxx。
ngx_printf.cxx:放和打印格式相关的函数;
ngx_log.cxx:放和日志相关的函数;
ngx_log_stderr() :三个特殊文件描述符【三章七节】,谈到了标准错误 STDERR_FILENO,代表屏幕
ngx_log_stderr():往屏幕上打印一条错误信息;功能类似于printf
printf(“mystring=%s,myint=%d,%d”,”mytest”,15,20);
(1)根据可变的参数,组合出一个字符串:mystring=mytest,myint=15,20
(2)往屏幕上显示出这个组合出来的字符串;
ngx_log_stderr():可以支持任意我想支持的格式化字符 %d, %f,对于扩展原有功能非常有帮助
(i)void ngx_log_stderr(int err, const char *fmt, …)
(i) p = ngx_vslprintf(p,last,fmt,args); //实现了自我可定制的printf类似的功能
(i) buf = ngx_sprintf_num(buf, last, ui64, zero, hex, width);
(i) p = ngx_log_errno(p, last, err);
1 | void ngx_log_stderr(int err, const char *fmt, ...) |
换行回车进一步示意
\r:回车符,把打印【输出】信息的为止定位到本行开头
\n:换行符,把输出为止移动到下一行
一般把光标移动到下一行的开头,\r\n
a)比如windows下,每行结尾 \r\n
b)类Unix,每行结尾就只有\n
c)Mac苹果系统,每行结尾只有\r
结论:统一用\n就行了
printf()函数不加\n无法及时输出的解释
printf末尾不加\n就无法及时的将信息显示到屏幕 ,这是因为 行缓存[windows上一般没有,类Unix上才有]
需要输出的数据不直接显示到终端,而是首先缓存到某个地方,当遇到行刷新表指或者该缓存已满的情况下,菜会把缓存的数据显示到终端设备;
ANSIC中定义\n认为是行刷新标记,所以,printf函数没有带\n是不会自动刷新输出流,直至行缓存被填满才显示到屏幕上;
所以大家用printf的时候,注意末尾要用\n;
或者:fflush(stdout);
或者:setvbuf(stdout,NULL,_IONBF,0); //这个函数. 直接将printf缓冲区禁止, printf就直接输出了。
标准I/O函数,后边还会讲到
设置时区
linux系统时区
我们要设置成CST时区,以保证日期,时间显示的都正确
我们常看到的时区,有如下几个:
a)PST【PST美国太平洋标准时间】 = GMT - 8;
b)GMT【格林尼治平均时间Greenwich Mean Time】等同于英国伦敦本地时间
c)UTC【通用协调时Universal Time Coordinated】 = GMT
d)CST【北京时间:北京时区是东八区,领先UTC八个小时】
修改linux系统时间
1 | tzselect --临时修改 |
1 | sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --将临时修改永久保存 |
日志等级划分
1 | //日志相关-------------------- |
修改nginx.conf文件,加入日志配置信息。