Skip to content

Commit 8b8eef8

Browse files
elboulangeropoettering
authored andcommitted
Add --log-level option
Now the log level can be set with: casync --log-level debug|info|error ... This command-line argument overrides the environment variable `CASYNC_LOG_LEVEL`. Closes: #185 Signed-off-by: Arnaud Rebillout <[email protected]>
1 parent c603308 commit 8b8eef8

File tree

4 files changed

+56
-18
lines changed

4 files changed

+56
-18
lines changed

doc/casync.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ Options
151151
General options:
152152

153153
--help, -h Show terse help output
154+
--log-level=<LEVEL>, -l Set log level (debug, info, err)
154155
--verbose, -v Show terse status information during runtime
155156
--dry-run, -n Only print what would be removed with **gc**
156157
--store=PATH The primary chunk store to use

src/casync-tool.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ static enum arg_what {
4343
WHAT_DIRECTORY,
4444
_WHAT_INVALID = -1,
4545
} arg_what = _WHAT_INVALID;
46+
static int arg_log_level = -1;
4647
static bool arg_verbose = false;
4748
static bool arg_dry_run = false;
4849
static bool arg_exclude_nodump = true;
@@ -88,6 +89,7 @@ static void help(void) {
8889
"Content-Addressable Data Synchronization Tool\n\n"
8990
" -h --help Show this help\n"
9091
" --version Show brief version information\n"
92+
" -l --log-level=LEVEL Set log level (debug, info, err)\n"
9193
" -v --verbose Show terse status information during runtime\n"
9294
" -n --dry-run When garbage collecting, only print what would\n"
9395
" be done\n"
@@ -349,6 +351,7 @@ static int parse_argv(int argc, char *argv[]) {
349351
static const struct option options[] = {
350352
{ "help", no_argument, NULL, 'h' },
351353
{ "version", no_argument, NULL, ARG_VERSION },
354+
{ "log-level", required_argument, NULL, 'l' },
352355
{ "verbose", no_argument, NULL, 'v' },
353356
{ "dry-run", no_argument, NULL, 'n' },
354357
{ "store", required_argument, NULL, ARG_STORE },
@@ -387,7 +390,7 @@ static int parse_argv(int argc, char *argv[]) {
387390
if (getenv_bool("CASYNC_VERBOSE") > 0)
388391
arg_verbose = true;
389392

390-
while ((c = getopt_long(argc, argv, "hvnc", options, NULL)) >= 0) {
393+
while ((c = getopt_long(argc, argv, "hl:vnc", options, NULL)) >= 0) {
391394

392395
switch (c) {
393396

@@ -399,6 +402,15 @@ static int parse_argv(int argc, char *argv[]) {
399402
version();
400403
return 0;
401404

405+
case 'l':
406+
r = set_log_level_from_string(optarg);
407+
if (r < 0)
408+
return log_error_errno(r, "Failed to parse log level \"%s\": %m", optarg);
409+
410+
arg_log_level = r;
411+
412+
break;
413+
402414
case 'v':
403415
arg_verbose = true;
404416
break;
@@ -679,7 +691,13 @@ static int parse_argv(int argc, char *argv[]) {
679691
}
680692
}
681693

682-
/* Propagate our verbose setting to helpers we fork off */
694+
/* Propagate some settings to helpers we fork off */
695+
if (arg_log_level >= 0) {
696+
char buffer[DECIMAL_STR_MAX(int)];
697+
snprintf(buffer, sizeof(buffer), "%d", arg_log_level);
698+
(void) setenv("CASYNC_LOG_LEVEL", buffer, 1);
699+
}
700+
683701
if (arg_verbose)
684702
(void) putenv((char*) "CASYNC_VERBOSE=1");
685703
else

src/log.c

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,36 @@
1010

1111
static int cached_log_level = -1;
1212

13+
static int level_from_string(const char *str) {
14+
if (STR_IN_SET(str, "emerg", "emergency", "0"))
15+
return LOG_EMERG;
16+
else if (STR_IN_SET(str, "alert", "1"))
17+
return LOG_ALERT;
18+
else if (STR_IN_SET(str, "crit", "critical", "2"))
19+
return LOG_CRIT;
20+
else if (STR_IN_SET(str, "err", "error", "3"))
21+
return LOG_ERR;
22+
else if (STR_IN_SET(str, "warn", "warning", "4"))
23+
return LOG_WARNING;
24+
else if (STR_IN_SET(str, "notice", "5"))
25+
return LOG_NOTICE;
26+
else if (STR_IN_SET(str, "info", "6"))
27+
return LOG_INFO;
28+
else if (STR_IN_SET(str, "debug", "7"))
29+
return LOG_DEBUG;
30+
else
31+
return -EINVAL;
32+
}
33+
1334
static int get_log_level(void) {
1435
if (cached_log_level < 0) {
1536
const char *e;
1637

1738
cached_log_level = LOG_INFO;
1839

1940
e = getenv("CASYNC_LOG_LEVEL");
20-
if (e) {
21-
if (STR_IN_SET(e, "emerg", "emergency", "0"))
22-
cached_log_level = LOG_EMERG;
23-
else if (STR_IN_SET(e, "alert", "1"))
24-
cached_log_level = LOG_ALERT;
25-
else if (STR_IN_SET(e, "crit", "critical", "2"))
26-
cached_log_level = LOG_CRIT;
27-
else if (STR_IN_SET(e, "err", "error", "3"))
28-
cached_log_level = LOG_ERR;
29-
else if (STR_IN_SET(e, "warn", "warning", "4"))
30-
cached_log_level = LOG_WARNING;
31-
else if (STR_IN_SET(e, "notice", "5"))
32-
cached_log_level = LOG_NOTICE;
33-
else if (STR_IN_SET(e, "debug", "7"))
34-
cached_log_level = LOG_DEBUG;
35-
}
41+
if (e)
42+
set_log_level_from_string(e);
3643
}
3744

3845
return cached_log_level;
@@ -42,6 +49,17 @@ void set_log_level(int level) {
4249
cached_log_level = level;
4350
}
4451

52+
int set_log_level_from_string(const char *str) {
53+
int level;
54+
55+
level = level_from_string(str);
56+
if (level < 0)
57+
return level;
58+
59+
cached_log_level = level;
60+
return level;
61+
}
62+
4563
static int log_fullv(
4664
int level,
4765
int error,

src/log.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ static inline int log_oom(void) {
3838
} while(false)
3939

4040
void set_log_level(int level);
41+
int set_log_level_from_string(const char *str);

0 commit comments

Comments
 (0)