Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Log format #704

Merged
merged 7 commits into from
Oct 24, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions common/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ static int ccnet_log_level;
static int seafile_log_level;
static char *logfile;
static FILE *logfp;
static gboolean log_to_stdout = FALSE;

#ifndef WIN32
#ifdef SEAFILE_SERVER
Expand All @@ -40,6 +41,8 @@ get_syslog_level (GLogLevelFlags level)
return LOG_WARNING;
case G_LOG_LEVEL_ERROR:
return LOG_ERR;
case G_LOG_LEVEL_CRITICAL:
return LOG_ERR;
default:
return LOG_DEBUG;
}
Expand All @@ -59,12 +62,24 @@ seafile_log (const gchar *log_domain, GLogLevelFlags log_level,
if (log_level > seafile_log_level)
return;

if (log_to_stdout) {
fputs ("[seaf-server] ", logfp);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

应该在 seafile_log_init 函数增加一个参数(第一个参数),用于指定组件的名称,因为需要区分 seaf-server, seaf-fuse, controller 三个组件的日志的。还有 slow log 也有自己的日志名称。

}

t = time(NULL);
tm = localtime(&t);
len = strftime (buf, 1024, "%Y-%m-%d %H:%M:%S ", tm);
len = strftime (buf, 1024, "[%Y-%m-%d %H:%M:%S] ", tm);
g_return_if_fail (len < 1024);
if (logfp) {
fputs (buf, logfp);
if (log_level == G_LOG_LEVEL_DEBUG)
fputs ("[DEBUG] ", logfp);
else if (log_level == G_LOG_LEVEL_WARNING)
fputs ("[WARNING] ", logfp);
else if (log_level == G_LOG_LEVEL_CRITICAL)
fputs ("[ERROR] ", logfp);
else
fputs ("[INFO] ", logfp);
fputs (message, logfp);
fflush (logfp);
}
Expand Down Expand Up @@ -95,6 +110,14 @@ ccnet_log (const gchar *log_domain, GLogLevelFlags log_level,
g_return_if_fail (len < 1024);
if (logfp) {
fputs (buf, logfp);
if (log_level == G_LOG_LEVEL_DEBUG)
fputs ("[DEBUG] ", logfp);
else if (log_level == G_LOG_LEVEL_WARNING)
fputs ("[WARNING] ", logfp);
else if (log_level == G_LOG_LEVEL_CRITICAL)
fputs ("[ERROR] ", logfp);
else
fputs ("[INFO] ", logfp);
fputs (message, logfp);
fflush (logfp);
}
Expand Down Expand Up @@ -132,9 +155,11 @@ seafile_log_init (const char *_logfile, const char *ccnet_debug_level_str,
ccnet_log_level = get_debug_level(ccnet_debug_level_str, G_LOG_LEVEL_INFO);
seafile_log_level = get_debug_level(seafile_debug_level_str, G_LOG_LEVEL_DEBUG);

if (strcmp(_logfile, "-") == 0) {
const char *log_to_stdout_env = g_getenv("SEAFILE_LOG_TO_STDOUT");
if (g_strcmp0(_logfile, "-") == 0 || g_strcmp0(log_to_stdout_env, "true") == 0) {
logfp = stdout;
logfile = g_strdup (_logfile);
log_to_stdout = TRUE;
}
else {
logfile = ccnet_expand_path(_logfile);
Expand All @@ -152,7 +177,7 @@ seafile_log_reopen ()
{
FILE *fp, *oldfp;

if (strcmp(logfile, "-") == 0)
if (g_strcmp0(logfile, "-") == 0 || log_to_stdout)
return 0;

if ((fp = g_fopen (logfile, "a+")) == NULL) {
Expand Down
4 changes: 4 additions & 0 deletions common/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
#define seaf_message(fmt, ...) g_message("%s(%d): " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#endif

#ifndef seaf_error
#define seaf_error(fmt, ...) g_critical("%s(%d): " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#endif


int seafile_log_init (const char *logfile, const char *ccnet_debug_level_str,
const char *seafile_debug_level_str);
Expand Down
49 changes: 26 additions & 23 deletions controller/seafile-controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ start_seaf_server ()
"-l", logfile,
"-P", ctl->pidfile[PID_SERVER],
"-p", ctl->rpc_pipe_path,
"-f",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

controller 和 seaf-server 应该在检测到 SEAFILE_LOG_TO_STDOUT 这个环境变量之后,主动禁用 daemon mode。这里不应该直接禁用 daemon mode,因为会影响非 docker 部署的用户。docker 部署下,应该是不需要 daemon mode 的,因为容器会一直运行。

NULL};

int pid = spawn_process (argv, false);
Expand Down Expand Up @@ -568,8 +569,8 @@ seaf_controller_init (SeafileController *ctl,
char *topdir = g_path_get_dirname(config_dir);
logdir = g_build_filename (topdir, "logs", NULL);
if (checkdir_with_mkdir(logdir) < 0) {
fprintf (stderr, "failed to create log folder \"%s\": %s\n",
logdir, strerror(errno));
seaf_error ("failed to create log folder \"%s\": %s\n",
logdir, strerror(errno));
return -1;
}
g_free (topdir);
Expand Down Expand Up @@ -683,12 +684,13 @@ set_signal_handlers ()
static void
usage ()
{
fprintf (stderr, "Usage: seafile-controller OPTIONS\n"
"OPTIONS:\n"
" -b, --bin-dir insert a directory in front of the PATH env\n"
" -c, --config-dir ccnet config dir\n"
" -d, --seafile-dir seafile dir\n"
);
seafile_log_init ("-", "debug", "debug");
seaf_error ("Usage: seafile-controller OPTIONS\n"
"OPTIONS:\n"
" -b, --bin-dir insert a directory in front of the PATH env\n"
" -c, --config-dir ccnet config dir\n"
" -d, --seafile-dir seafile dir\n"
);
}

/* seafile-controller -t is used to test whether config file is valid */
Expand Down Expand Up @@ -717,9 +719,8 @@ test_config (const char *central_config_dir,
&error);

if (error != NULL) {
fprintf (stderr,
"failed to run \"seaf-server -t\": %s\n",
error->message);
seaf_error ("failed to run \"seaf-server -t\": %s\n",
error->message);
exit (1);
}

Expand All @@ -732,8 +733,7 @@ test_config (const char *central_config_dir,
}

if (retcode != 0) {
fprintf (stderr,
"failed to run \"seaf-server -t\" [%d]\n", retcode);
seaf_error ("failed to run \"seaf-server -t\" [%d]\n", retcode);
exit (1);
}

Expand Down Expand Up @@ -869,7 +869,9 @@ int main (int argc, char **argv)
exit(1);
break;
case 'v':
fprintf (stderr, "seafile-controller version 1.0\n");
seafile_log_init ("-", "debug", "debug");
seaf_message ("seafile-controller version 1.0\n");
exit(1);
break;
case 't':
test_conf = TRUE;
Expand Down Expand Up @@ -911,13 +913,21 @@ int main (int argc, char **argv)
g_thread_init (NULL);
#endif

char *logfile = g_build_filename (ctl->logdir, "controller.log", NULL);
if (seafile_log_init (logfile, ccnet_debug_level_str,
seafile_debug_level_str) < 0) {
seafile_log_init ("-", ccnet_debug_level_str, seafile_debug_level_str);
seaf_error ("Failed to init log.\n");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

在 seafile_log_init 之前的日志,就用 printf 输出就行了,这些都是些参数错误,在生产环境是不会出现的,所以不重要。其他几个组件也不需要改这些日志的输出了。

controller_exit (1);
}

if (!seafile_dir) {
fprintf (stderr, "<seafile_dir> must be specified with --seafile-dir\n");
seaf_error ("<seafile_dir> must be specified with --seafile-dir\n");
exit(1);
}

if (!central_config_dir) {
fprintf (stderr, "<central_config_dir> must be specified with --central-config-dir\n");
seaf_error ("<central_config_dir> must be specified with --central-config-dir\n");
exit(1);
}

Expand All @@ -934,13 +944,6 @@ int main (int argc, char **argv)
controller_exit(1);
}

char *logfile = g_build_filename (ctl->logdir, "controller.log", NULL);
if (seafile_log_init (logfile, ccnet_debug_level_str,
seafile_debug_level_str) < 0) {
seaf_warning ("Failed to init log.\n");
controller_exit (1);
}

if (init_syslog_config () < 0) {
controller_exit (1);
}
Expand Down
31 changes: 29 additions & 2 deletions fileserver/fileserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,20 @@ var logFp *os.File
var dbType string
var seafileDB, ccnetDB *sql.DB

var logToStdout bool

func init() {
flag.StringVar(&centralDir, "F", "", "central config directory")
flag.StringVar(&dataDir, "d", "", "seafile data directory")
flag.StringVar(&logFile, "l", "", "log file path")
flag.StringVar(&rpcPipePath, "p", "", "rpc pipe path")
flag.StringVar(&pidFilePath, "P", "", "pid file path")

env := os.Getenv("SEAFILE_LOG_TO_STDOUT")
if env == "true" {
logToStdout = true
}

log.SetFormatter(&LogFormatter{})
}

Expand All @@ -61,8 +68,23 @@ const (
type LogFormatter struct{}

func (f *LogFormatter) Format(entry *log.Entry) ([]byte, error) {
buf := make([]byte, 0, len(timestampFormat)+len(entry.Message)+1)
levelStr := entry.Level.String()
if levelStr == "fatal" {
levelStr = "ERROR"
} else {
levelStr = strings.ToUpper(levelStr)
}
level := fmt.Sprintf("[%s] ", levelStr)
appName := ""
if logToStdout {
appName = "[fileserver] "
}
buf := make([]byte, 0, len(appName)+len(timestampFormat)+len(level)+len(entry.Message)+1)
if logToStdout {
buf = append(buf, appName...)
}
buf = entry.Time.AppendFormat(buf, timestampFormat)
buf = append(buf, level...)
buf = append(buf, entry.Message...)
buf = append(buf, '\n')
return buf, nil
Expand Down Expand Up @@ -320,7 +342,9 @@ func main() {
loadSeafileDB()
option.LoadFileServerOptions(centralDir)

if logFile == "" {
if logToStdout {
// Use default output (StdOut)
} else if logFile == "" {
absLogFile = filepath.Join(absDataDir, "fileserver.log")
fp, err := os.OpenFile(absLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
Expand Down Expand Up @@ -420,6 +444,9 @@ func handleUser1Signal() {
}

func logRotate() {
if logToStdout {
return
}
// reopen fileserver log
fp, err := os.OpenFile(absLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
Expand Down
3 changes: 2 additions & 1 deletion fuse/seaf-fuse.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,8 @@ int main(int argc, char *argv[])

if (seafile_log_init(logfile, ccnet_debug_level_str,
seafile_debug_level_str) < 0) {
fprintf(stderr, "Failed to init log.\n");
seafile_log_init("-", ccnet_debug_level_str, seafile_debug_level_str);
seaf_error("Failed to init log.\n");
exit(1);
}

Expand Down
6 changes: 3 additions & 3 deletions server/gc/seaf-fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ static const struct option long_opts[] = {

static void usage ()
{
fprintf (stderr,
"usage: seaf-fsck [-r] [-E exported_path] [-c config_dir] [-d seafile_dir] "
"[repo_id_1 [repo_id_2 ...]]\n");
seafile_log_init ("-", "info", "debug");
seaf_error ("usage: seaf-fsck [-r] [-E exported_path] [-c config_dir] [-d seafile_dir] "
"[repo_id_1 [repo_id_2 ...]]\n");
}

#ifdef WIN32
Expand Down
16 changes: 8 additions & 8 deletions server/gc/seafserv-gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ static const struct option long_opts[] = {

static void usage ()
{
fprintf (stderr,
"usage: seafserv-gc [-c config_dir] [-d seafile_dir] "
"[repo_id_1 [repo_id_2 ...]]\n"
"Additional options:\n"
"-r, --rm-deleted: remove garbaged repos\n"
"-R, --rm-fs: remove fs object\n"
"-D, --dry-run: report blocks that can be remove, but not remove them\n"
"-V, --verbose: verbose output messages\n");
seafile_log_init ("-", "info", "debug");
seaf_error ("usage: seafserv-gc [-c config_dir] [-d seafile_dir] "
"[repo_id_1 [repo_id_2 ...]]\n"
"Additional options:\n"
"-r, --rm-deleted: remove garbaged repos\n"
"-R, --rm-fs: remove fs object\n"
"-D, --dry-run: report blocks that can be remove, but not remove them\n"
"-V, --verbose: verbose output messages\n");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gc 和 fsck 的 usage 日志不用改了。

}

#ifdef WIN32
Expand Down
10 changes: 4 additions & 6 deletions server/seaf-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ static struct option long_options[] = {

static void usage ()
{
fprintf (stderr, "usage: seaf-server [-c config_dir] [-d seafile_dir]\n");
seafile_log_init ("-", "info", "debug");
seaf_error ("usage: seaf-server [-c config_dir] [-d seafile_dir]\n");
}

#include <searpc.h>
Expand Down Expand Up @@ -1186,18 +1187,15 @@ test_seafile_config(const char *central_config_dir, const char *config_dir, cons
central_config_dir = ccnet_expand_path (central_config_dir);
}

if (seafile_log_init ("-", "debug", "debug") < 0) {
fprintf (stderr, "seafile_log_init error: %s\n", strerror(errno));
return -1;
}
seafile_log_init ("-", "debug", "debug");

srand (time(NULL));

event_init ();

seaf = seafile_session_new (central_config_dir, seafile_dir, config_dir, NULL, NULL);
if (!seaf) {
fprintf (stderr, "Error: failed to create ccnet session\n");
seaf_error ("Error: failed to create ccnet session\n");
return -1;
}

Expand Down
Loading