第三部・進階功能 / 3.2

大型檔案與即時日誌

超過 64 MiB 的檔案不會整份載入記憶體,而是換成一種唯讀的閱讀模式,並且每 250 毫秒盯著檔案有沒有變。拿來看 log 特別好用。

閱讀時間 約 10 分鐘 對象 要看大檔或 log 的人 先備知識 2.1 版本 v1.0 ・ 2026-08-26
3.2.1

什麼時候會進入大型檔案模式

門檻只有一個數字:64 MiB。

開檔時檔案大小達到 64 MiB,爾雅就不會把它整份讀進記憶體,而是換成一種唯讀的閱讀模式。訊息列會說「已以大型檔案唯讀模式開啟 access.log(512 MB)」,狀態列的模式那一格變成 大型檔案唯讀。

爾雅 Erya │ [access.log]
F1 說明 Ctrl+S 儲存 Ctrl+W 搜尋 Ctrl+R 取代 Ctrl+B 矩形選取 Ctrl+K 剪行 Ctrl+X 離開
10.0.1.24 - - [25/Aug/2026:09:14:02 +0800] "GET /api/v1/orders HTTP/1.1" 200 10.0.1.31 - - [25/Aug/2026:09:14:02 +0800] "POST /api/v1/login HTTP/1.1" 302 10.0.2.10 - - [25/Aug/2026:09:14:03 +0800] "GET /static/app.js HTTP/1.1" 304
access.log │ 1284391:1 │ 大型檔案唯讀 │ UTF-8 │ LF
已以大型檔案唯讀模式開啟 access.log(512 MB)
三種大檔的走法不一樣
  • 大的 UTF-8 文字檔 → 大型檔案唯讀模式(本章)。
  • 大的二進位檔 → 串流的十六進位檢視,一樣唯讀(見 3.3.8)。
  • 大的非 UTF-8 文字檔(例如 200 MB 的 Big5 匯出檔)→ 爾雅無法串流解碼,會當成二進位檔用十六進位開啟。要編輯的話得先在外面轉成 UTF-8。
3.2.2

這個模式下能做什麼

看得到、找得到、複製得走;但改不了。

可以做

  • 捲動、翻頁、Ctrl+Home/Ctrl+End
  • Ctrl+G 跳到指定行
  • Ctrl+W 搜尋、F3 找下一個
  • 選取與 Ctrl+C 複製
  • Ctrl+L 自動換行
  • Ctrl+P 十六進位檢視
  • 開新頁籤、切換頁籤、離開

做不到(會顯示「大型檔案使用唯讀模式;無法修改內容」)

  • 打字、刪除、貼上、剪下、刪行
  • 儲存與另存新檔
  • 取代(Ctrl+R/F5/F6)
  • 復原與重做
  • 編碼與換行轉換(F7/F8)
  • 格式化、段落重排、矩形填滿與搬動
  • 插入常用語、執行巨集
兩件事在這個模式下不會發生
  • 沒有語法高亮。整份都是純文字顏色——高亮需要解析整份內容,這裡刻意關掉。
  • 不能雙欄比對。按 F4 選到大型檔案會被擋下來:「大型檔案唯讀模式暫不支援雙欄比對,以避免載入完整內容造成記憶體耗盡」(見 3.4.9)。
3.2.3

記憶體是怎麼省下來的

只記「路標」,需要哪一行才去磁碟讀哪一行。

磁碟上的 512 MB 檔案 從頭到尾串流掃描一次 第 1 行 第 4097 行 第 8193 行 第 12289 行 第 16385 行 … 記憶體裡只留這些檢查點:每 4096 行一筆位移 要顯示第 9000 行時,從第 8193 行那個檢查點開始往下讀 807 行就到了 不使用 memory mapping;單一超長行最多只預覽前 1 MiB,避免一行吃掉整個記憶體
圖 3.2.1 稀疏行索引。開檔時掃一遍建立檢查點,之後畫面要哪一行才去讀哪一行,所以 512 MB 的檔案也不會把記憶體吃光。這個模式已經用 500 MiB 的檔案實測過。
3.2.4

跟著 log 一直長

爾雅每 250 毫秒看一次檔案,新內容會自己出現。

這是大型檔案模式最實用的地方:拿它當 tail -f 用,而且可以搜尋、可以往回捲。

  1. 純追加時只補新的。爾雅只重建「最後一個還沒寫完的行」加上新增內容,不會重新掃描整個檔案,所以檔案再大也不會卡。
  2. 游標在檔尾就自動跟隨。停在最後一行的行尾時,新內容進來會自動把畫面推到最新。這就是 follow 模式。
  3. 游標移開就停住。只要你往回捲去看別的地方,畫面就固定在你正在讀的位置,不會被新進來的內容拉走。想繼續跟隨就按 Ctrl+End 回到檔尾。
  4. 更新時訊息列會說「偵測到檔案更新;已重新整理內容」。
看 log 的標準流程

erya /var/log/nginx/access.log → Ctrl+End 跳到檔尾開始跟隨 → 想查東西就 Ctrl+W 搜尋、F3 逐一往下 → 看完按 Ctrl+End 回到跟隨狀態。全程不用離開編輯器。

3.2.5

截斷與 rotation

檔案不是「變長」而是「換了一份」的時候。

磁碟上發生的事爾雅的反應常見情境
結尾追加內容只補新的部分,很快服務持續寫 log
檔案被清空(截斷)重新開啟並重建索引> access.log、logrotate 的 copytruncate
檔案被原地改寫重新開啟並重建索引整份重新產生的報表
檔案被換掉(rotation)重新開啟並重建索引logrotate 換新檔
rotation 之後你看的是新檔案

爾雅追的是路徑,所以 access.log 被換掉之後,你看到的會是新的那一份(通常是空的或很短),舊內容跑到 access.log.1 去了。要看舊的就另外開一個頁籤。

3.2.6

一般檔案的外部變更

小檔案也在盯,只是反應方式不同。

同一個 250 毫秒的檢查,對一般大小的檔案也在做——差別在於一般檔案可以編輯,所以要先判斷你有沒有改過(完整說明見 2.1.7):

檔案類型你沒改過你改過
一般文字檔自動重新載入,復原紀錄清空只提醒,等你按 Ctrl+S 時才用紅色確認列問(O/R/N)
大型檔案自動重新整理不可能發生——這個模式本來就不能改
3.2.7

三種外部變更的處理

整理成一張表,遇到時照著看就好。

訊息列顏色你該做什麼
偵測到外部更新;已安全重新載入檔案黃不用做什麼。內容已經是最新的了,但復原紀錄沒了。
偵測到檔案更新;已重新整理內容黃大型檔案模式的自動更新,不用做什麼。
檔案已被外部程式修改;儲存前需要確認黃提醒而已,還沒擋你。存檔時會跳確認。
外部檔案已有更新:[O]覆寫、[R]重新載入、[N/Esc]取消紅要做決定了。不確定就按 N,再 F12 另存一份(2.1.7)。
重新整理外部檔案失敗:…黃檔案被刪掉、權限變了或磁碟出問題。先確認檔案還在不在。
3.2.8

常見錯誤

大型檔案模式的六個常見疑問。

現象原因與處理
打字沒反應,說唯讀檔案超過 64 MiB,這個模式不能編輯(3.2.2)。要改請用其他工具切小,或先取出片段。
沒有語法高亮大型檔案模式刻意停用(3.2.2)。
畫面一直被拉到最後面游標停在檔尾,正在跟隨。往回捲就會停住(3.2.4)。
畫面不會自己更新游標已經不在檔尾了。按 Ctrl+End 回去(3.2.4)。
log 突然變空的被截斷或 rotation 了,你看的是新的那一份(3.2.5)。
大的中文檔開起來變十六進位非 UTF-8 的大檔無法串流解碼,會走二進位路線(3.2.1)。先在外面轉成 UTF-8。