feat(logs)!: move logs to stdpath("state")/logs

This commit is contained in:
Olivia Kinnear
2026-03-28 22:06:47 -05:00
parent 5c8a93001c
commit 6bea0cdbdc
5 changed files with 20 additions and 16 deletions

View File

@@ -20,6 +20,7 @@ API
• |nvim_create_autocmd()|, |nvim_exec_autocmds()| and |nvim_clear_autocmds()|
no longer treat an empty non-nil pattern as nil.
• |nvim_clear_autocmds()| no longer treats an empty array event as nil.
• `stdpath("log")` moved to `stdpath("state")/logs`.
DIAGNOSTICS

View File

@@ -1405,12 +1405,15 @@ CACHE DIRECTORY (DEFAULT) ~
Unix: ~/.cache ~/.cache/nvim
Windows: ~/AppData/Local/Temp ~/AppData/Local/Temp/nvim-data
LOG DIRECTORY (DEFAULT) ~
*$XDG_STATE_HOME*/.../logs Nvim: stdpath("log") >
Unix: Not applicable ~/.local/state/nvim/logs
Windows: Not applicable ~/AppData/Local/nvim-data/logs
LOG FILE (DEFAULT) ~
`$NVIM_LOG_FILE` Nvim: stdpath("log")/nvim.log >
Unix: ~/.local/state/nvim ~/.local/state/nvim/nvim.log
Windows: ~/AppData/Local/nvim-data ~/AppData/Local/nvim-data/nvim.log
Note that stdpath("log") is currently an alias for stdpath("state").
Unix: ~/.local/state/nvim ~/.local/state/nvim/logs/nvim.log
Windows: ~/AppData/Local/nvim-data ~/AppData/Local/nvim-data/logs/nvim.log
ADDITIONAL CONFIGS DIRECTORY (DEFAULT) ~
*$XDG_CONFIG_DIRS* Nvim: stdpath("config_dirs") >
@@ -1448,8 +1451,8 @@ LOG FILE *log* *$NVIM_LOG_FILE* *E5430*
Besides 'debug' and 'verbose', Nvim keeps a general log file for internal
debugging, plugins and RPC clients. >
:echo $NVIM_LOG_FILE
Default location is stdpath("log")/log ($XDG_STATE_HOME/nvim/nvim.log) unless
that path is inaccessible or $NVIM_LOG_FILE was set before |startup|.
Default location is stdpath("log")/nvim.log ($XDG_STATE_HOME/nvim/logs/nvim.log)
unless that path is inaccessible or $NVIM_LOG_FILE was set before |startup|.
vim:et:tw=78:ts=8:sw=4:ft=help:norl:

View File

@@ -7161,7 +7161,7 @@ static void f_stdpath(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
} else if (strequal(p, "state")) {
rettv->vval.v_string = get_xdg_home(kXDGStateHome);
} else if (strequal(p, "log")) {
rettv->vval.v_string = get_xdg_home(kXDGStateHome);
rettv->vval.v_string = concat_fnames_realloc(get_xdg_home(kXDGStateHome), "logs", true);
} else if (strequal(p, "run")) {
rettv->vval.v_string = stdpaths_get_xdg_var(kXDGRuntimeDir);
} else if (strequal(p, "config_dirs")) {

View File

@@ -58,9 +58,9 @@ static bool log_try_create(char *fname)
/// Initializes the log file path and sets $NVIM_LOG_FILE if empty.
///
/// Tries $NVIM_LOG_FILE, or falls back to $XDG_STATE_HOME/nvim/nvim.log. Failed
/// initialization indicates either a bug in expand_env() or both $NVIM_LOG_FILE
/// and $HOME environment variables are undefined.
/// Tries $NVIM_LOG_FILE, or falls back to $XDG_STATE_HOME/nvim/logs/nvim.log.
/// Failed initialization indicates either a bug in expand_env() or both
/// $NVIM_LOG_FILE and $HOME environment variables are undefined.
static void log_path_init(void)
{
size_t size = sizeof(log_file_path);
@@ -75,8 +75,8 @@ static void log_path_init(void)
// Used by _core/log.lua:check_log_file to validate logfile on startup.
os_setenv("__NVIM_LOG_FILE_WANT", log_file_path, true);
}
// Make $XDG_STATE_HOME if it does not exist.
char *loghome = get_xdg_home(kXDGStateHome);
// Make $XDG_STATE_HOME/logs if it does not exist.
char *loghome = concat_fnames_realloc(get_xdg_home(kXDGStateHome), "logs", true);
char *failed_dir = NULL;
int log_dir_failure = 0;
if (!os_isdir(loghome)) {
@@ -84,7 +84,7 @@ static void log_path_init(void)
}
XFREE_CLEAR(loghome);
// Invalid $NVIM_LOG_FILE or failed to expand; fall back to default.
char *defaultpath = stdpaths_user_state_subpath("nvim.log", 0, true);
char *defaultpath = stdpaths_user_state_subpath("logs/nvim.log", 0, true);
size_t len = xstrlcpy(log_file_path, defaultpath, size);
xfree(defaultpath);
// Fall back to $CWD/nvim.log

View File

@@ -260,7 +260,7 @@ describe('startup defaults', function()
NVIM_LOG_FILE = '', -- Empty is invalid.
},
})
eq(xdgstatedir .. '/nvim.log', t.fix_slashes(eval('$NVIM_LOG_FILE')))
eq(xdgstatedir .. '/logs/nvim.log', t.fix_slashes(eval('$NVIM_LOG_FILE')))
end)
it('defaults to stdpath("log")/nvim.log if invalid', function()
@@ -271,7 +271,7 @@ describe('startup defaults', function()
NVIM_LOG_FILE = '.', -- Any directory is invalid.
},
})
eq(xdgstatedir .. '/nvim.log', t.fix_slashes(eval('$NVIM_LOG_FILE')))
eq(xdgstatedir .. '/logs/nvim.log', t.fix_slashes(eval('$NVIM_LOG_FILE')))
-- Avoid "failed to open $NVIM_LOG_FILE" noise in test output.
expect_exit(command, 'qall!')
end)
@@ -928,7 +928,7 @@ describe('stdpath()', function()
clear({ env = { NVIM_APPNAME = appname, NVIM_LOG_FILE = testlog } })
eq(appname, fn.fnamemodify(fn.stdpath('config'), ':t'))
eq(appname, fn.fnamemodify(fn.stdpath('cache'), ':t'))
eq(maybe_data(appname), fn.fnamemodify(fn.stdpath('log'), ':t'))
eq(maybe_data(appname), fn.fnamemodify(fn.stdpath('log'), ':h:t'))
eq(maybe_data(appname), fn.fnamemodify(fn.stdpath('data'), ':t'))
eq(maybe_data(appname), fn.fnamemodify(fn.stdpath('state'), ':t'))
-- config_dirs and data_dirs are empty on windows, so don't check them on