I would like to output in local time, America/Los_Angeles
to the log file. Currently, I'm getting times in UTC. I'm hoping a solution exists within these three functions.
/* src/lib/timing.c line 196 */
char* xdebug_nanotime_to_chars(uint64_t nanotime, unsigned char precision)
{
char *res;
time_t secs;
secs = (time_t)(nanotime / NANOS_IN_SEC);
if (precision > 0) {
res = xdmalloc(30);
} else {
res = xdmalloc(20);
}
strftime(res, 20, "%Y-%m-%d %H:%M:%S", gmtime(&secs));
if (precision > 0) {
sprintf(res + 19, ".%09u", (uint32_t)(nanotime % NANOS_IN_SEC));
if (precision < 9) {
*(res + 20 + precision) = '\0';
}
}
return res;
}
Open log. Set log_open_timestring
with xdebug_nanotime_to_chars
function.
/* src/lib/log.c line 586 */
void xdebug_open_log(void)
{
/* initialize remote log file */
XG_LIB(log_file) = NULL;
XG_LIB(log_opened_message_sent) = 0;
XG_LIB(log_open_timestring) = NULL;
if (XINI_LIB(log) && strlen(XINI_LIB(log))) {
XG_LIB(log_file) = xdebug_fopen(XINI_LIB(log), "a", NULL, NULL);
}
if (XG_LIB(log_file)) {
XG_LIB(log_open_timestring) = xdebug_nanotime_to_chars(xdebug_get_nanotime(), 6);
} else if (strlen(XINI_LIB(log))) {
xdebug_log_diagnose_permissions(XLOG_CHAN_LOGFILE, NULL, XINI_LIB(log));
}
}
Prints log open time to log file:
/* src/lib/log.c line 56 */
static inline void xdebug_internal_log(int channel, int log_level, const char *message)
{
zend_ulong pid;
if (!XG_LIB(log_file)) {
return;
}
pid = xdebug_get_pid();
if (!XG_LIB(log_opened_message_sent) && XG_LIB(log_open_timestring)) {
XG_LIB(log_opened_message_sent) = 1;
fprintf(XG_LIB(log_file), "[" ZEND_ULONG_FMT "] Log opened at %s\n", pid, XG_LIB(log_open_timestring));
fflush(XG_LIB(log_file));
xdfree(XG_LIB(log_open_timestring));
XG_LIB(log_open_timestring) = NULL;
}
fprintf(
XG_LIB(log_file),
"[" ZEND_ULONG_FMT "] %s%s%s\n",
pid,
xdebug_channel_name[channel],
xdebug_log_prefix[log_level],
message
);
fflush(XG_LIB(log_file));
}
This ended up being pretty simple.
All I had to do was change gmtime
to localtime
and now all outputs are in my system time instead of UTC.
(Also, of course, had to compile Xdebug from my modified source.)
/* src/lib/timing.c line 196 */
char* xdebug_nanotime_to_chars(uint64_t nanotime, unsigned char precision)
{
char *res;
time_t secs;
secs = (time_t)(nanotime / NANOS_IN_SEC);
if (precision > 0) {
res = xdmalloc(30);
} else {
res = xdmalloc(20);
}
/* strftime(res, 20, "%Y-%m-%d %H:%M:%S", gmtime(&secs)); */ right here!
strftime(res, 20, "%Y-%m-%d %H:%M:%S", localtime(&secs));
if (precision > 0) {
sprintf(res + 19, ".%09u", (uint32_t)(nanotime % NANOS_IN_SEC));
if (precision < 9) {
*(res + 20 + precision) = '\0';
}
}
return res;
}
Outputs now match my current timezone, where it is just before 5pm:
[12122] Log opened at 2020-12-31 16:50:29.447626
[12122] Log closed at 2020-12-31 16:50:29.780099
I suppose I could add the timezone identifier to the end of the line if I wanted to make it absolutely clear. I'll edit my answer if I do that.
EDIT: I added the timezone identifier. I created a new function to be used in the log opening and closing functions.
/* src/lib/log.c */
const char* custom_get_tz() /* placed near top of file */
{
time_t t = time(NULL);
struct tm lt = {0};
localtime_r(&t, <);
return lt.tm_zone;
}
.
.
.
/* around line 63 */
static inline void xdebug_internal_log(int channel, int log_level, const char *message)
{
.
.
.
/* fprintf(XG_LIB(log_file), "[" ZEND_ULONG_FMT "] Log opened at %s\n", pid, XG_LIB(log_open_timestring)); */
fprintf(XG_LIB(log_file), "[" ZEND_ULONG_FMT "] Log opened at %s %s\n", pid, XG_LIB(log_open_timestring), custom_get_tz());
.
.
.
}
.
.
.
/* around line 610 */
void xdebug_close_log()
{
.
.
.
/* fprintf(XG_LIB(log_file), "[" ZEND_ULONG_FMT "] Log closed at %s\n\n", pid, timestr); */
fprintf(XG_LIB(log_file), "[" ZEND_ULONG_FMT "] Log closed at %s %s\n\n", pid, timestr, custom_get_tz());
.
.
.
}
Tested by changing system timezone to America/Goose_Bay and UTC:
[31250] Log opened at 2021-01-02 13:44:07.952185 PST
.
.
.
[31250] Log closed at 2021-01-02 13:44:07.957961 PST
[31252] Log opened at 2021-01-02 17:45:55.684079 AST
.
.
.
[31252] Log closed at 2021-01-02 17:45:55.687655 AST
[31254] Log opened at 2021-01-02 21:47:18.788958 UTC
.
.
.
[31254] Log closed at 2021-01-02 21:47:18.792282 UTC