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

Error Log formater should containt context #29

Closed
Halama opened this issue May 14, 2018 · 33 comments
Closed

Error Log formater should containt context #29

Halama opened this issue May 14, 2018 · 33 comments

Comments

@Halama
Copy link
Member

Halama commented May 14, 2018

$errorHandler->setFormatter(new LineFormatter("%message%\n"));

https://github.com/keboola/php-component/pull/28/files#r188015982

@tomasfejfar
Copy link
Contributor

tomasfejfar commented May 14, 2018

Jasně - ten "errorLog" padá celý do papertrailu pak. Takže tam dává smysl mít k tomu i ty další věci. Ale pro ten "log" je ta jen message správně, chápu to správně?

@Halama
Copy link
Member Author

Halama commented May 14, 2018

jj přesně tak, ten kontext atd. jenom pro errorLog a standardní log nechat jenom message.

@Halama
Copy link
Member Author

Halama commented May 14, 2018

ještě by mě teda zajímalo co @pivnicek vedlo k téhle úpravě keboola/db-extractor-common@09c6fd5#diff-a6bfadf6e476180bac436fced8a2e014

@Halama
Copy link
Member Author

Halama commented May 14, 2018

např. u writerů je to ok https://github.com/keboola/db-writer-common/blob/master/src/Logger.php
a analytics taky https://github.com/keboola/google-analytics-extractor/blob/master/src/Keboola/GoogleAnalyticsExtractor/Logger/Logger.php

Uff, ještě že už máme php-component a už to nebude takhle rozházený všude :)

@tomasfejfar
Copy link
Contributor

Tam je vůbec zajímavé, že se error-loguje všechno od notice výše.

@Halama
Copy link
Member Author

Halama commented May 14, 2018

co vím tak nikde moc jiného nelogujeme, jako že bud info nebo error...

@odinuv
Copy link
Member

odinuv commented May 14, 2018

ten context a extra se zamerne nekde vyhazoval (slo by dohledat na slacku), protoze nekomu vadilo, ze tam je porad [] [] a totez s casem - ve storage eventech jsou pak casy dva.

to [] [] je resitelny nestandardnim formatterem, ktery to prazdne nebude vypisovat

jinak formatter by mel byt podle me stejny pro err i info, protoze proste obe veci jdou do eventu

@Halama
Copy link
Member Author

Halama commented May 14, 2018

to souvisi s tim ze docker runner to neumi poslat jenom do PT. V tuhle chvili je to absolutne nedebugovatelny pokud jde do PT jen message.

@Halama
Copy link
Member Author

Halama commented May 14, 2018

takze ted urcite tak ze to posila context do error logu

@odinuv
Copy link
Member

odinuv commented May 14, 2018

no to neni ale "ted", proste pokud komponenta stdout posle message a kontext, tak docker runner nikdy nepozna, co z toho ma poslat kam, protoze dostane proste nejakej flak textu (kvuli OB navic jeste casto slepenej z vic zprav), jedina cesta ven je ten message mit strukruovany (cili gelf)
se stdout/stderr loggerem muzeme udelat maximalne to, aby to vsechen stderr poslalo jen do pt a uzivali zobrazilo jen stdout
cili puvodni myslenka byla takova, ze stdout/stderr bude na jednoduchy veci a strukturovany pujdou pres gelf
jestli chcem logovat context pres stdout, tak bude vzdycky v eventech

@Halama
Copy link
Member Author

Halama commented May 14, 2018

tak ty komponenty pak musi mit gelf, protoze takhle je to nepouzitelny

@Halama
Copy link
Member Author

Halama commented May 14, 2018

ale ten gelf mi ale zatim taky neprijde uplne pouzitelny https://keboola.slack.com/archives/C09U3R1J4/p1526301111000369

@Halama
Copy link
Member Author

Halama commented May 14, 2018

nevermind, zkusim to udelat jinak, kazdopadne plati, ze trace ma jit na stderr

a to je presne to o co mi tady jde

https://keboola.slack.com/archives/C31U6BGJC/p1525878243000655?thread_ts=1525874098.000502&cid=C31U6BGJC

@Halama
Copy link
Member Author

Halama commented May 14, 2018

https://keboola.slack.com/archives/C31U6BGJC/p1525874098000502

Jestli jsem to pochopil správně tak to kumuluje error output. Proč to v případě exit code > 1 nehodí dummy internal error zprávu a jinak at to vyplivne to co to pochytalo?

@odinuv
Copy link
Member

odinuv commented May 14, 2018

celkem souhlas

jsou podle me 3 moznosti:

  1. v logu pouzivat jen message, mit lineformatter na message a trace vypisovat na stderr:
try {
    $app = new MyComponent\Component();
    $app->run();
    exit(0);
} catch (\Keboola\Component\UserException $e) {
    echo $e->getMessage();
    exit(1);
} catch (\Throwable $e) {
    error_log(get_class($e) . ':' . $e->getMessage());
    error_log("\nFile: " . $e->getFile());
   error_log("\nLine: " . $e->getLine());
    error_log("\nCode: " . $e->getCode());
    error_log("\nTrace: " . $e->getTraceAsString() . "\n");
    exit(2);
}
  1. mit defaultni lineformatter, pouzivat libovolny parmetery loggeru a smirit se s tim, ze veskery kontext jde do eventu
  2. gelf (nebo jinej strukturovanej log, kterej nemame :)

Ve vsech pripadech by to potom melo fungovat tak, ze:
do eventu jde info, (warn), err krome situace kdy komponenta skonci app errorem, kdy se ma vsekerej err stopit a poslat jen do PT a uzivateli zobrazit dummy hlasku

coz by melo byt z vetsi casti fixly tady keboola/docker-bundle#293
(ale chci to jeste znovu projit, je to pomerne dost kombinaci)

@Halama
Copy link
Member Author

Halama commented May 14, 2018

jeste me napadlo ze jedine kdy te zajima ten kontext je application error. Tzn. ze by logger fungoval jako 1) mel by proste jenom Line formatter s message a vse slo do event. A v pripade application error by clovek pred exit code 2 mel moznost dumpnout ten stack trace do nejakeho souboru ktery by docker runner potom poslal do S3 a PT.

@odinuv
Copy link
Member

odinuv commented May 14, 2018

no, vsak to v te 1) staci - v pripade app-err dumpnes trace na stderr a docker runner ho posle jen do PT (a syrup do S3), pokud se tady https://github.com/keboola/php-component/blob/master/example/run.php vymeni echo za error_log a mergne tohle keboola/docker-bundle#293 tak to tak bude fungovat

@Halama
Copy link
Member Author

Halama commented May 14, 2018

Je ta 1) teda stejná jako? V tomhle ani imho tom tvem pripade nebudou user error eventy cervene.

$errHandler = new StreamHandler('php://stderr', \Monolog\Logger::CRITICAL, false);
$handler = new StreamHandler('php://stdout',  \Monolog\Logger::INFO);
$handler->setFormatter( new LineFormatter("%message%\n"));
$logger = new \Monolog\Logger('app', [$errHandler, $handler]);

try {
    $app = new MyComponent\Component();
    $app->run();
    exit(0);
} catch (\Keboola\Component\UserException $e) {
    $logger->error($e->getMessage());
    exit(1);
} catch (\Throwable $e) {
   $logger->critical($e->getMessage(), [
        'errFile' => $e->getFile(),
        'errLine' => $e->getLine(),
        'trace' => $e->getTrace()
    ]);
    exit(2);
}

@odinuv
Copy link
Member

odinuv commented May 14, 2018

pardon, takhle to ma byt

try {
    $app = new MyComponent\Component();
    $app->run();
    exit(0);
} catch (\Keboola\Component\UserException $e) {
    error_log( $e->getMessage());
    exit(1);
} catch (\Throwable $e) {
    error_log(get_class($e) . ':' . $e->getMessage());
    error_log("\nFile: " . $e->getFile());
   error_log("\nLine: " . $e->getLine());
    error_log("\nCode: " . $e->getCode());
    error_log("\nTrace: " . $e->getTraceAsString() . "\n");
    exit(2);
}

@Halama
Copy link
Member Author

Halama commented May 14, 2018

jo jasne, to mi tam nesedelo. Tak potom by to mohlo byt takhle, coz je snad to samy jenom s loggerem.

$appErrHandler = new StreamHandler('php://stderr', \Monolog\Logger::CRITICAL, false);
$userErrHandler = new StreamHandler('php://stderr', \Monolog\Logger::ERROR, false);
$userErrHandler->setFormatter( new LineFormatter("%message%\n"));
$handler = new StreamHandler('php://stdout',  \Monolog\Logger::INFO);
$handler->setFormatter( new LineFormatter("%message%\n"));
$logger = new \Monolog\Logger('app', [$appErrHandler, $userErrHandler, $handler]);

try {
    $app = new MyComponent\Component();
    $app->run();
    exit(0);
} catch (\Keboola\Component\UserException $e) {
    $logger->error($e->getMessage());
    exit(1);
} catch (\Throwable $e) {
   $logger->critical($e->getMessage(), [
        'errFile' => $e->getFile(),
        'errLine' => $e->getLine(),
        'trace' => $e->getTrace()
    ]);
    exit(2);
}

@odinuv
Copy link
Member

odinuv commented May 14, 2018

jo, to by melo fungovat

@Halama
Copy link
Member Author

Halama commented May 14, 2018

a ono to bufferovani toho error outpuptu az nakonec ted fakt funguje?

@Halama
Copy link
Member Author

Halama commented May 14, 2018

podle tohodle keboola/docker-bundle#236 (comment) mi prijde ze ne. nebo je to stary issue?

@odinuv
Copy link
Member

odinuv commented May 14, 2018

jo funguje - stdout/stderr (u gelfu si nejsem jistej), akoratze se vyprintuje i pri apperr, ten screen je stary

@Halama
Copy link
Member Author

Halama commented May 14, 2018

ok, přijde mi to bufferování trochu divný ale imho by většina appek na stderr nic sypat během běhu stejně neměla....

@odinuv
Copy link
Member

odinuv commented May 14, 2018

jo je, proto jsem udelal tu issue keboola/docker-bundle#236, kdyby to pak koncilo warningem (a kdyby se ten event jeste nejak vizualne oddelil), tak uz by to tak moc divny nebylo

kazdopadne prubezne se to vypisovat nemuze, pokud se to ma v pripade apperru skryt

@Halama
Copy link
Member Author

Halama commented May 14, 2018

ja bych to klidne nechal vypisovat. jenom by se proste stack trace neposilal na stderr ale dumpnul by se bokem do souboru. Ale jinak to reseni 1) s tim bufferovanim mi taky prijde cajk celkem...

@odinuv
Copy link
Member

odinuv commented May 14, 2018

no tak to asi celkem neni problem udelat neco jako ze '/data/error.trace` se hodi do PT, mohlo by to pak generovat citelnejsi tracy, ale nedelam si moc velky iluze, ze by se to ujalo mezi 4th party vyvojarema

@ondrejhlavacek
Copy link
Member

nemusel by to bejt error.trace, ale nějakej obecnej log, kterej bude v eventech skrytej a jen se uploadne někam, kde k němu budeme mít přístup my a potenciálně i 3rd party developer pro debug. pokud by se na to aplikoval filtr na zašifrovaný hodnoty, tak by to mohlo bejt i trochu bezpečný, nicméně leaky dat tam hrozí tak jako tak :-(

@Halama
Copy link
Member Author

Halama commented May 15, 2018

ty leaky hrozej v obou pripadech imho uplne stejne, je jedno jakym zpusobem to leze ven.

Ted bych se asi ale spokojil s merge keboola/docker-bundle#293 (review) ktery zajisti ze to pri internal error neposle error log uzivateli ale preda ho jenom do PT v kombinaci s #29 (comment)

@odinuv
Copy link
Member

odinuv commented May 16, 2018

solved by 0ad130a

@odinuv odinuv closed this as completed May 16, 2018
@MiroCillik
Copy link
Member

MiroCillik commented May 24, 2018

Inak nemalo by tu byt spis level NOTICE misto WARNING?

$errorHandler->setLevel(MonologLogger::WARNING);

@odinuv
Copy link
Member

odinuv commented May 24, 2018

nemelo https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#log-levels NOTICE (250): Normal but significant events.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants