🧢

Neovimのログを揮発させて肥大化を防止する

に公開

この記事はVim駅伝の2025-09-24の記事です。
前回の記事はsirasagi62さんの日本語でコードを検索したい(on Neovim)です。

Vim駅伝は常に参加者を募集しています。詳しくはこちらのページをご覧ください。


この記事はvim-jp slackでアイデアをもらって書きました。

Neovimのログ、気づくと溜まりがち

Neovim(および多くのプラグイン)のログはstdpath('log')に蓄積されます。

https://neovim.io/doc/user/vimfn.html#stdpath()

で、ひたすらログが追記され続けるので、気づくとでかいファイルになっています。普段は気にしないのですが、:LspLogを実行したときなどに重すぎて警告が出たりします。
さらに、ログではないですが、筆者は'undofile'を有効にしているため、undoの記録も蓄積していました。これもいつの間にか大きくなりがちです。


undoディレクトリとlsp.logが10MBを超えててウケる

ログローテート的なことをしてもよいですが、業務システムのアクセスログでもないですし、この辺のログは問題が起きたときに直近数回の使用のログを眺められれば十分でしょう。
特に筆者はnightly版を使っているため、数日前のログはNeovimやプラグインのバージョンが異なっています。こういったログを見てもトラブルシューティングに寄与せず、単にストレージを圧迫するだけです。
ということで、適当なタイミングでバッサリ削除してしまって良いと思われます。

保存先をtmpにしちゃえ

ログをよしなに自動削除する仕組みを作るのも面倒なので、保存先をtmpディレクトリにして揮発性のログにします。PCの電源を落とすとログも吹き飛ぶということです。
ドキュメントによるとstdpath('log')stdpath('state')のエイリアスなので、$XDG_STATE_HOMEを書き換えればログの保存先を変更できます。
Neovimの設定ファイル内で行うことで、グローバルの設定は汚さず、Neovimの解釈する環境変数のみを書き換えることができます。

必要な設定はこれだけ。これを設定するより前にログが吐き出されてしまうと意味がないので、init.luaのなるべく最初の方で設定してください。

init.lua
vim.env.XDG_STATE_HOME = '/tmp'

ログディレクトリは$XDG_STATE_HOME/nvimに作られるので、/tmp/nvim以下にログが保存されるようになります。

これでファイルが追記され続ける問題は解決できるはずです。
あ、PCが起きている間はtmpディレクトリも残り続けるので、たまにPCの電源を切ってくださいね。

XDG_STATE_HOMEを書き換えず個別にやる場合

$XDG_STATE_HOMEをNeovim全体で書き換えてしまうのは乱暴すぎる!という場合は、個別にログ出力先を変更することもできます。

Neovim自体のログの保存先は環境変数$NVIM_LOG_FILEで指定できるので、こうなります。

init.lua
vim.env.NVIM_LOG_FILE = '/tmp/nvim/log'

また、Neovim LSPのログはvim.lsp.log._set_filename()で指定できます。_が前置されているので、内部関数ぽい(記事執筆時点でhelpファイルに記載がない)点には留意してください。

init.lua
vim.lsp.log._set_filename('/tmp/nvim/lsp.log')

以下のように細かく設定すれば日付ごとに別々のログを作るなども可能です。が、前述の通り、筆者はここまでする必要はないかなと考えています。日付ごとのログを見返すことなんてほぼないと思うので。

init.lua
local date = os.date("%y") .. os.date("%m") .. os.date("%d")
vim.env.NVIM_LOG_FILE = vim.fn.stdpath('log') .. '/nvim-' .. date .. '.log'
vim.lsp.log._set_filename(vim.fn.stdpath('log') .. '/lsp-' .. date .. '.log')

その他、プラグインが出しているログは各プラグインのヘルプを参照して設定してください。

Discussion