diff -Naur zabbix-3.4.11_origin/include/log.h zabbix-3.4.11_ZBXNEXT-3800/include/log.h --- zabbix-3.4.11_origin/include/log.h 2018-06-25 11:57:00.000000000 +0300 +++ zabbix-3.4.11_ZBXNEXT-3800/include/log.h 2018-07-02 15:21:35.715692400 +0300 @@ -59,6 +59,9 @@ #endif int zabbix_open_log(int type, int level, const char *filename, char **error); +int check_logfile_path(const char *filename); // ZBXNEXT-3800 +char *resolve_env_var(const char *filename); // ZBXNEXT-3800 + void zabbix_errlog(zbx_err_codes_t err, ...); void __zbx_zabbix_log(int level, const char *fmt, ...); void zabbix_close_log(void); diff -Naur zabbix-3.4.11_origin/src/libs/zbxlog/log.c zabbix-3.4.11_ZBXNEXT-3800/src/libs/zbxlog/log.c --- zabbix-3.4.11_origin/src/libs/zbxlog/log.c 2018-06-25 11:57:00.000000000 +0300 +++ zabbix-3.4.11_ZBXNEXT-3800/src/libs/zbxlog/log.c 2018-07-02 15:21:55.859692400 +0300 @@ -343,6 +343,37 @@ return SUCCEED; } +// ZBXNEXT-3800 start +int check_logfile_path(const char *filename) +{ + const char *var_ident = "%"; + + if (strstr(filename, var_ident)) + { + return SUCCEED; + } + else + { + return FAIL; + } +} + +char *resolve_env_var(const char *filename) +{ + char *env_name; + char *env_value; + char *rest_log_part; + const char *delimiter = "%"; + + env_name = strtok(filename, delimiter); + rest_log_part = strtok(NULL, delimiter); + env_value = getenv(env_name); + if (env_value != NULL) { + return strcat(env_value, rest_log_part); + } +} +// ZBXNEXT-3800 end + void zabbix_close_log(void) { if (LOG_TYPE_SYSTEM == log_type) diff -Naur zabbix-3.4.11_origin/src/zabbix_agent/zabbix_agentd.c zabbix-3.4.11_ZBXNEXT-3800/src/zabbix_agent/zabbix_agentd.c --- zabbix-3.4.11_origin/src/zabbix_agent/zabbix_agentd.c 2018-06-25 11:57:00.000000000 +0300 +++ zabbix-3.4.11_ZBXNEXT-3800/src/zabbix_agent/zabbix_agentd.c 2018-07-02 15:22:11.115692400 +0300 @@ -871,6 +871,7 @@ int i, j = 0; #ifdef _WINDOWS DWORD res; + char *log_path; #endif if (0 != (flags & ZBX_TASK_FLAG_FOREGROUND)) @@ -879,12 +880,34 @@ CONFIG_HOSTNAME, ZABBIX_VERSION, ZABBIX_REVISION); } +// ZBXNEXT-3800 start +#ifdef _WINDOWS + /* If LogFile contains '%' symbol, if includes Windows environment variable */ + if (SUCCEED == check_logfile_path(CONFIG_LOG_FILE)) { + log_path = resolve_env_var(CONFIG_LOG_FILE); + if (log_path == NULL) { + zbx_error("cannot resolve environment variable: %s", CONFIG_LOG_FILE); + exit(EXIT_FAILURE); + } + } else { + log_path = CONFIG_LOG_FILE; + } + + if (SUCCEED != zabbix_open_log(CONFIG_LOG_TYPE, CONFIG_LOG_LEVEL, log_path, &error)) + { + zbx_error("cannot open log: %s", error); + zbx_free(error); + exit(EXIT_FAILURE); + } +#else if (SUCCEED != zabbix_open_log(CONFIG_LOG_TYPE, CONFIG_LOG_LEVEL, CONFIG_LOG_FILE, &error)) { zbx_error("cannot open log: %s", error); zbx_free(error); exit(EXIT_FAILURE); } +#endif +// ZBXNEXT-3800 end #ifdef HAVE_IPV6 # define IPV6_FEATURE_STATUS "YES"