# 日志服務
Nginx日志主要有兩種:access_log(訪問日志)、error_log(錯誤日志)。
### access_log(訪問日志)
access_log主要記錄客戶端訪問Nginx的每一個請求,格式可以自定義。通過access_log,你可以得到用戶地域來源、跳轉來源、使用終端、某個URL訪問量等相關信息。
log_format指令用于定義日志的格式,語法: log_format name string; 其中name表示格式名稱,string表示定義的格式字符串。log_format有一個默認的無需設置的combined日志格式。
> 默認的無需設置的combined日志格式
~~~
log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
~~~
access_log指令用來指定訪問日志文件的存放路徑(包含日志文件名)、格式和緩存大小,語法:access_log path [format_name [buffer=size | off]]; 其中path表示訪問日志存放路徑,format_name表示訪問日志格式名稱,buffer表示緩存大小,off表示關閉訪問日志。
> log_format使用事例:在access.log中記錄客戶端IP地址、請求狀態和請求時間
~~~
log_format myformat '$remote_addr $status $time_local';
access_log logs/access.log myformat;
~~~
需要注意的是:log_format配置必須放在http內,否則會出現警告。Nginx進程設置的用戶和組必須對日志路徑有創建文件的權限,否則,會報錯。
定義日志使用的字段及其作用:
| 字段 | 作用 |
|-----|-----|
| $remote_addr與$http_x_forwarded_for | 記錄客戶端IP地址 |
| $remote_user | 記錄客戶端用戶名稱 |
| $request | 記錄請求的URI和HTTP協議 |
| $status | 記錄請求狀態 |
| $body_bytes_sent | 發送給客戶端的字節數,不包括響應頭的大小 |
| $bytes_sent | 發送給客戶端的總字節數 |
| $connection | 連接的序列號 |
| $connection_requests | 當前通過一個連接獲得的請求數量 |
| $msec | 日志寫入時間。單位為秒,精度是毫秒 |
| $pipe | 如果請求是通過HTTP流水線(pipelined)發送,pipe值為“p”,否則為“.” |
| $http_referer | 記錄從哪個頁面鏈接訪問過來的 |
| $http_user_agent | 記錄客戶端瀏覽器相關信息 |
| $request_length | 請求的長度(包括請求行,請求頭和請求正文) |
| $request_time | 請求處理時間,單位為秒,精度毫秒 |
| $time_iso8601 | ISO8601標準格式下的本地時間 |
| $time_local | 記錄訪問時間與時區 |
### error_log(錯誤日志)
error_log主要記錄客戶端訪問Nginx出錯時的日志,格式不支持自定義。通過查看錯誤日志,你可以得到系統某個服務或server的性能瓶頸等。因此,將日志好好利用,你可以得到很多有價值的信息。
error_log指令用來指定錯誤日志,語法: error_log path(存放路徑) level(日志等級); 其中path表示錯誤日志存放路徑,level表示錯誤日志等級,日志等級包括debug、info、notice、warn、error、crit,從左至右,日志詳細程度逐級遞減,即debug最詳細,crit最少,默認為crit。
注意:error_log off并不能關閉錯誤日志記錄,此時日志信息會被寫入到文件名為off的文件當中。如果要關閉錯誤日志記錄,可以使用如下配置:
> Linux系統把存儲位置設置為空設備
~~~
error_log /dev/null;
~~~
> Windows系統把存儲位置設置為空設備
~~~
error_log nul;
~~~
另外Linux系統可以使用tail命令方便的查閱正在改變的文件,tail -f filename會把filename里最尾部的內容顯示在屏幕上,并且不斷刷新,使你看到最新的文件內容。Windows系統沒有這個命令,你可以在網上找到動態查看文件的工具。
- 序
- Lua 入門
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- for
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- Nginx
- Nginx 新手起步
- location 匹配規則
- if 是邪惡的
- 靜態文件服務
- 日志服務
- 反向代理
- 負載均衡
- 陷阱和常見錯誤
- 環境搭建
- Windows平臺
- CentOS平臺
- Ubuntu平臺
- Mac OS X平臺
- Hello World
- 簡單API Server框架
- 獲取Nginx內置綁定變量
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 典型應用場景
- LuaRestyDNSLibrary
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- Web 服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- C10K編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題
- 開源文化對360企業安全的影響