Share
Embed
あなたのPHPアプリ、ログはでてますか?あるいはログをだしてますか? / Are you writing a log? Or just out a log?
PHPカンファレンス福岡 2023
2023/06/24
uzulla
uzulla
June 24, 2023
Transcript
56 slides
-
վֵͱվળ — վֵͱɺطଘΛʮཪΔʯ͜ͱ — վળͱɺطଘͷԆͰྑ͘͢Δ͜ͱ — ·ͣγεςϜͷվળΛߟ͑Δ — (ίʔυͰͳ͍ɺγεςϜશମ) —
৽نͷ࣌ʹվֵ͍͢͠ — (ίϯϙʔωϯτ୯ҐͰ) — ࠓʮେྔʯʹ͕͋ΔͳΒɺ·ͣݮΒͯ͠ΈΑ͏ — തଧશһͰૉפශʹͳΔ֮ޛΛͬͯΖ͏Ͷ -
ϩάྫ(Apache Access log) 127.0.0.1 - - [11/Jun/2023:10:30:15 +0000] "GET /index.html
HTTP/1.1" 200 1234 — 127.0.0.1ɿϦϞʔτͷIPΞυϨε — -ɿϦϞʔτϢʔβʔ໊ʢແࢦఆϋΠϑϯͰஔ͖͑ΒΕΔʣ — -ɿϦϞʔτೝূϢʔβʔ໊ʢແࢦఆϋΠϑϯͰஔ͖͑ΒΕΔʣ — [11/Jun/2023:10:30:15 +0000]ɿΞΫηε͕ൃੜͨ࣌͠ɺܗ͕ࣜ࠷ѱʂ — "GET /index.html HTTP/1.1"ɿHTTPϝιουɺPATHɺϓϩτίϧͱόʔδϣϯ — 200ɿHTTPεςʔλείʔυ — 1234ɿϨεϙϯεͷαΠζʢόΠτʣ -
ϩάͱ͍͑ΞΫηεϩά — ͳͥͳΒɺݹདྷඞͣ͋ͬͨ — ʮΤϥʔϩάʁग़ͳ͍͜ͱଟ͔ͬͨͳ(Ϩϯαό࣌Λࢥ͍ग़͠ͳ͕Β)ʯ — ʮ͜ΜͳϩάΈͨ͜ͱͳ͍ͳʯʮApacheͰ͢·Μʯ — ʮΞΫηεϩάͬͯϛυϧΣΞͰ͢ΑͶʯʮ͍ʯ —
࠷ۙGoogle Analyticsͱ͔ͰݟΔ͠ɺ ຊʹࠔͬͨͱ͖͘Β͍͔͠ݟͳ͍͔ — ߏԽ͞Ε͍ͯΔ͕ɺඪ४ͳ͍ — ApacheɺnginxɺPHPͷ-SͰҟͳΔ͠ɺେΧελϜͰ͖Δ — ͱ͍͏͔ɺApacheͷaccess logܗࣜ΄΅͔ͭΘΕͯͳͯ͘ɺCustomLogͷ combinedܗ͕ࣜී௨ -
Ͱɺϩάͱʁ — ͳΜΒ͔ͷΠϕϯτ࣌ʹ͞ΕΔϝοηʔδ — ਓؒػց͕ಡΉͨΊʹ͢ — ྺ࢙తʹςΩετͷ͜ͱ͕ଟ͍ — ͳΜ͔ͩΜͩҰߦͷ͜ͱ͕ଟ͍͕ɺGrep͍͔͢͠ΒͩΖ͏ —
ߏԽ͞Ε͍ͯΔ — ͱ͔ɺIPͱ͔ɺUAͱ͔৭ʑͳϝλσʔλ — ύʔεͷͨΊʹJSONɺLTSVͳͲॲཧ͍͢͠ͷʹ͢Δ͜ͱ -
ԿͰݟͯ·͢ʁ — ʮงғؾʯ — ϑΝΠϧΛcatɾtailɺgrep — Τεύʔɺ͋Δ͍ϩάͷ༷ — Slack௨ —
ϩάϓϥοτϑΥʔϜͰूͯ͠ݕࡧ — ML/AIʹΑΔΞϊʔϚϦʔ௨ -
ʮΤϥʔϩάΈͯ·͔͢ʂʯ — Apachephp-fpm͔Βग़ͯ͘Δ͍ΘΏΔΤϥʔϩά — ʮྫΛڍ͛ΔΑΓɺࣗࣾͷΤϥʔϩάΈͯΈ·͠ΐ͏ɺ॓ͳʂʂʂʯ ʮखൈ͖Ͱʁʯ — ઃܭɾίʔυ͕ؒҧͬͨΓɺDBʹଓͰ͖ͳ͔ͬͨΓ͢Δͱग़Δͭ — ಈ͔ͳ͍ͷͰɺϩάҎલʹؾͮ͘
— ʮಈ͍ͨɺϤγʂʂʯ=> ཪͰେྔͷNOTICE,WARN,STRICT,DEPRECATED — ͭ·Γɺݟͯͳ͍ਓࠓ͙͢লͯ͠΄͍͠ — PHPͷΤϥʔϩάʮൃใଆʯͷϨϕϧௐ͕Ͱ͖ΔΘ͚Ͱͳ͍ͷͰɺࣺͯΒΕ͕ ͪ (ϨϕϧΛมߋ͢Δͱɺݟ͑ͳ͘ͳΔ) — (ࠓճͷओͰͳ͍(͕ݴΘͣʹ͍ΒΕͳ͍ͷ͕PHPerͰ͋Δ) -
ͰɺϩάͷྫΛ͔͍͜͠AI܅ʹͩͯ͠Β͍·ͨ͠ʂ — Failed to connect to the database server —
Incorrect username or password — The requested resource could not be found — You do not have permission to access this resource — The user exceeded the rate limit for this resource -
ԶͳΒApproveͤΜͧ — ʮThisͬͯͳʹʁɺThe userͬͯ୭ʁʯ — ରԠ͢ΔͨΊͷใ͕ͨΓͳ͍ — ϦΫΤετIDͱ͔ɺϩάΠϯϢʔβʔͱ͔ͦ͏͍͏ͷೖΕͨํ͕ྑ͍ - {ͳΜΒ͔ΞΠςϜ}
could not be found - UID:234 does not have permission to access resource_id: abc - UID:123 exceeded the rate limit for resource: def — ͨͩ͠ɺେྔʹϩά͕Ͱ͓ͯΓɺͦΕͷूΛ͍ͯ͠Δ߹രൃతʹ૿͑Δ͜ͱ͕͋Δ (·͋ɺͦΕઌʹͨ͠ํ͕ྑ͍ͷͰ…) -
ͦͯ͠ɺΕͣʹΞΫγϣϯʹͭͳ͛Ζʂ — ʮ͜͏ͯ͠΄͍͠ͳʯͱࢥͬͯɺॻ͔ͳ͍ͱ·ͣͭͨΘΒͳ͍ — ʮյΕͨϑΝΠϧΛফͤʯͱ͔ϩάʹॻ͍͓ͯ͘·Ͱ͋Δ — खॱॻόάνέͱͭͳ͕͍ͬͯΔ͜ͱ͕·͍͠ — ͳ͓ɺURLมΘΔͷͰɺݕࡧ༻ʹIDʹ͢Δํ͕ྑ͍ —
ID࿈൪UUID͕ྑ͍ — ҙຯΛͨͤΔͷݸਓతʹΞϯνύλʔϯ — (ϦϑΝΫλ͠ʹ͘͘ͳΔ) — …͕ɺͳ͔ͥΈΜͳIDʹҙຯΛ͕࣋ͨͤͨΔ͠…·͋ͬͯΈ͍͍ͯͷͰ… — Զ͓קΊ͠ͳ͍͚Ͳͳʂʂ -
> Error: Error ͳʹ͕Τϥʔͳͷʁʁʁ > Error: User Information update. …Ͳ͜Ͱʁ୭͕ʁ
> Error: User update fail. user_id: 1 ͏ʔΜ…͜ͷϝοηʔδɺͲ͜ͷॴ͚ͩͬͳ…શจݕࡧ͠Α͏͔…ʁ·͋໘͔ͩΒΈͳ͔ͬͨ͜ͱʹ͢Δ͔ʁ > Error: User update fail. user_id: 1 on /path/to/Some.php:123 ;ʔΜɺ͜ͷϑΝΠϧ͔…ͳΜͱͳ͘Θ͔Γͦ͏ͩͳ…Ͱ·͋ݟͳ͔ͬͨ͜ͱʹ͍͍ͯ͠ͷ͔Θ͔ΒΜͳ > Emerg: Update user order record fail. user_id: 1 on /path/to/Some.php:123 Emergʁͬͯ͜ͱக໋తΤϥʔ͔ʂͩΕ͔͜ΕͲ͏͢Ε͍͍͔ͬͯ͠ΔʁͱΓ͋͑ͣίʔυಡΜͰௐࠪ͢Δ͔…ʂ > Emerg: Update user order record fail. user_id: 1 on /path/to/Some.php:123 see OpDoc:ABC123 க໋తΤϥʔͩʂDocΈͯΈΑ͏ʂ…ͳΔ΄Ͳ·ͣCR͞Μʹ࿈བྷ͔ɺϢʔβʔ͠ΒͯୈҰใʂͦͷޙӡ༻ͰΧόʔ͔ʂ -
͞ΒͳΔయܕతͳίϯςΩετɾϝλσʔλ — ϑΝΠϧͱߦ൪߸ɺελοΫτϨʔεવཱ͓ͪใ — ઈରʹඞཁͳͷϩΨʔͷϋϯυϥͰࣗಈతʹೖΕΔͷྑ͍ — ϩΨʔͰϩάϝοηʔδΛՃ͠ɺఆܗͰೖΕΔͳͲ — ϋϯυϥʹ͍ͭͯɺmonologͷυΩϡϝϯτɺ͓͗͞ΜͷτʔΫΛݟ͍ͯͩ͘͞ —
࠷ۙNewRelicͱ͔DataDogͱ͔ͷAPM͍ΕͯΔͱࣗಈతʹूΊͯ͘ΕΔɺศརʂ — ຊʹศརͳͷͰɺૉʹۚΛͬͯߦ͘ͷ͕ྑ͍ͱࢥ͍·͢ɻ — ϙϯʂͱͰͨΤϥʔʹͦ͏͍ͬͨίϯςΩετ͕ࣗಈͰ͍ͭͯ͘ΕΔɺ࠷ߴ -
ΞΫγϣϯ͕͖·ΔͱɺϩάϨϕϧ͕ܾ·Δ − ී௨ͷϩΨʔϩάϨϕϧΛ࣋ͭ - DEBUG - INFO - NOTICE -
WARNING - ERROR - CRITICAL - ALERT - EMERGENCY -
ϨϕϧΞΫγϣϯ࣌ͷτϦΞʔδͰ͋Δ — ۓٸɺଈԠɺܦա؍ɺͲ͏Ͱ͍͍ɺ։ൃ༻ͱ͔ — ·͋σϑΥϧτΤϥʔͰ͢ΑͶɺͳ͔ͥ͠ΒΜ͕ɻ — ͜Ε͕උ͞Ε͍ͯͳ͍ͱແࢹʹͭͳ͕Δ — શ෦͕Errorͩͱ… ʮͳΜ͔ΤϥʔͰͯ·͚͢Ͳ…ʁʯ
ʮ͋ͬ͜ͷΤϥʔແࢹ͍͍ͯ͠ΤϥʔͳΜͰʯ ʮ͔ͦͬʙʙ(ͦΜͳ͜ͱΘ͔Δ͔ʂೋͱݟͳ͍Θʂ)ʯ — ͋ͳ͔ͨ͠ղΒͳ͍ͱɺपΓαϙʔτͰ͖ͳ͍ — ʮ͜ΕଈԠ͕ඞཁͰͨ͠ʂͳΜͰແࢹͨ͠ΜͰ͔͢ʂʯ ʮ͠ΒΜ͕ͳ(͋͋ʂ͢Έ·ͤΜͰͨ͠ʂࠓޙؾΛ͚ͭ·͢ʂ)ʯ -
ͱ͍͑Ή͔͍ͣ͠ɺԹ͕ࠩ͋Δ — νʔϜͰ߹ҙΛऔΔඞཁ͕͋Δ — ྫ:ʮਂʹ͖ͨͨى͜͞ΕΔ͖͔ʁʯσʔλ͕յΕଓ͚Δʁ — ྫ:ʮ࣍ͷӦۀͰྑ͍ʯӨڹൣғ͕͕Δʁ — ྫ:ʮϦτϥΠͰΔʯਓؒͷରԠ͕…ඞཁɾෆཁʁ —
͜͏͍͏ͷΛɺ૾ͯ͠ϩάϨϕϧʹϚοϓͯ͠ԹײΛܾΊΔ — ͜ͷ͋ͨΓޙͰม͑ΒΕΔ — ϩάϨϕϧͷྨΛޙͰม͑Δͷେม͕ͩɺ ϩάϨϕϧʹରԠ͢Δߦಈม͍͑͢ — ͱΓ͋͑ͣ৭ʑߟ͑ͯΈͯ΄͍͠ -
Ͱɺϩάͷൃใ(ൃੜ)Ͳ͜Ͱ͢Δʁ — جຊతʹɺ(͍ΘΏΔ)ίϯτϩʔϥυϝΠϯͰൃੜͤ͞Δ͖ͩͱʮࢲʯࢥ͏ — ͦΕ͕ʮͲ͏ѻΘΕΔ͔ʯஅͰ͖Δ — ࢀরϖʔδͷDBΫΤϦࣦഊͱ͔Ͳ͏ͰΑ͍͕ɺ ܾࡁͷDBΫΤϦࣦഊϠό͍ͳͲ͋Δ — ϥΠϒϥϦϨϙδτϦͱ͔Ԟਂ͘ͰΔͱ͍͜͠
— ʮϩΨʔΛҾͰύεͯ͠ߦ͚Δൣғʯ͕ແͱࢥ͏ — ϥΠϒϥϦͰΤϥʔͳΒྫ֎Λͳ͛ɺ্Ґʹͤͨํ͕ྑ͍ — ͦͷͨΊʹಠࣗྫ֎ͱ͔ॻ͜͏ — ʮྫ֎ݏ͍ͳΜͰ͢Αʯ ʮ͡Ό͍͍͋Τϥʔදݱํ๏͓͑ͯ͘͠Εɺ-1ฦ͢ͱ͔ແ͠ͳʂʯ -
۩ମతͳϩΨʔ(ϩάΛൃੜͤ͞Δͷ)ʹ͍ͭͯ — جຊmonologɺσϑΝΫτελϯμʔυ — monolog֦ுੑ͕ߴ͍ — ϓϩηοαɺϋϯυϥɺϑΥʔϚολΛొɾࣗ࡞Ͱ͖Δ — Ճɺϝλσʔλऩू༩ɺૹ৴(อଘ)ͳͲ͕ࣗ༝ʹ —
͜ͷޙͷ͓͗͞ΜͷτʔΫΛΈͯ͘Ε — ϩΨʔෳ࡞ΕΔ — ͜ͷϨϕϧҎԼແࢹ͢ΔϩΨʔ — ͜ͷϨϕϧͳΒSlackʹඈ͢ϩΨʔ — — ·͋ɺ࠷ڧͰ͢ɻߟ͑Δ͘Β͍ͳΒmonologͰ -
Slack௨ྫ // ϩΨʔΛ࡞ $log = new Logger('slack_logger'); // ϑΝΠϧϋϯυϥΛՃ $log->pushHandler(new
StreamHandler('/path/to/log')); // SlackϋϯυϥΛՃʢϩάϨϕϧ͕ΫϦςΟΧϧͷ߹ͷΈʣ $log->pushHandler(new SlackWebhookHandler($slackWebhookUrl), Logger::CRITICAL); // ϩάϝοηʔδΛه $log->error('Slackʹඈͳ͍'); $log->critical('SlackʹඈͿ'); -
ϩΨʔෳੜ͞ΕΔલఏʹ — ʮελςΟοΫʹίʔϧ͢ΔͱศརʂʯΞϯνύλʔϯ — UnitTestͰʮ͜͜Ͱnull ϩΨʔʯͱ͔͍ͨ͠ — Feature Flagͱ૬ੑΑ͍ —
ϦϦʔεޙɺ͜ͷػೳ͚ͩϩάϨϕϧม͍͑ͨͱ͔͋Δ — ίʔυͷԞਂ͘ͰϩάϨϕϧΛIFذ͢Δͷਖ਼ؾͰͳ͘ɺFeature୯ҐͰϨϕϧΛม ͑ͨϩΨʔΛInjectͰ͖ͨ΄͏͕ศར — ࠷ѱɺϝοηʔδʹPrefixͱ͔ɺಠࣗϩάϨϕϧͱ͔ɺϋϯυϥͰվมͱ͔͋Δ ͕ɺ͏ʔΜ… — ϩΨʔࣗମΛࠩ͠ସ͑ͨ΄͏͕Ͳ͏ߟ͑ͯ҆શ -
class SomeFeature{ public function __construct(Logger $logger){} public function run(); }
// == in prod $log = new Logger('slack_logger'); $log->pushHandler(new StreamHandler('path/to/log')); $log->pushHandler(new SlackWebhookHandler($slackWebhookUrl)); $some = new SomeFeature($log); // SlackͱϑΝΠϧʹอଘ // == in tests $log = new Logger('null_logger'); $log->pushHandler(new NullHandler()); $some = new SomeFeature($log); // ڏۭʹফ͑Δ -
ϩάΠϕϯτͰ͋ΓɺଟॏͳετϦʔϜ — ϩάΠϕϯτ(Ϩίʔυ)Ͱ͋ΓɺʮҰߦͷςΩετʯͰͳ͍ — SourceͱFilterͱSinkΛߟ͑Δ — Sourceൃใɺ͜͜·Ͱઆ໌ͨ͠ͱ͓Γ — Filterࣗಈతʹ͍ΕͨΓɺܗͨ͠ΓɺJSONʹͨ͠Γ —
SinkϑΝΠϧͩͬͨΓɺసૹͩͬͨΓɺ௨ͩͬͨΓ — ଟஈɾଟॏʹͰ͖Δ — monologͷத͚ͩͰͳ͘ɺେମͷϩάج൫ͦ͏͍ͬͨ֓೦͕͋Δ(ͬͱߴ͚ͩ Ͳɺ·͋جຊతͳߟ͑ํͱͯ͠) — ͜ͷ͋ͨΓ͜ͷޙͷ͓͗͞ΜͷτʔΫΛݟ͍ͯͩ͘͞ — ʮMonologͷ࣮ʹֶͿInterfaceͷ͍Ͳ͜Ζʯ -
// == ͋ΔPHPͷத… +-------------+ | Source | +-------------+ | v
+-------------+ | Filter | +-------------+ | v +-------------+ | Sink | +-------------+ -
// == ͋ΔPHPͷத… +-------------+ | Source | +-------------+ | v
+-------------+ | Filter | +-------------+ | v +-------------+ | Sink | +-------------+ | // == ͔͜͜Βɺผͷϩάج൫… v +-------------+ | Source | +-------------+ | v +-------------+ | Filter | +-------------+ | v +-------------+ | Sink | +-------------+ -
(লུ) | v +-------------+ | Sink | +-------------+ | //
== ذίϐʔ(ෳͷૹ৴)͋ΔΑʂ ├----------------------┐ v v +-------------+ +-------------+ | Source | | Source | +-------------+ +-------------+ | | v v +-------------+ +-------------+ (লུ) -
ΰουϩΨʔ — ϑϥΫλϧ(ೖΕࢠ)ͳߟ͑ํΛͤͣɺ۪ʹίʔυΛॻ͘ͱࠈͰ͢ — ʮͳΜͰͦΜͳநతͳ͜ͱΛ͠ͳ͍ͱ͍͚ͳ͍ͷʁ͜͜ʹSlackʹૹ৴͔͚͍͍ͬͯ ͡ΌΜʯʮͦ͏͢Δͱͳɺෛ࠴Λະདྷʹ͓͘Δ͜ͱʹͳΔΜ͡Όʯ — (ظతʹͦ͏͢Δͱ͔ɺϨΨγʔίʔυ͔ͩΒ͔ͨ͠ͳ͘Θ͔Δ͕ɺ৽نͰϠό ͍) —
ৼΔ͍Λਂ͘ʹॻ͖ࠐΉͳʂ — ʮ͜͜ͷΤϥʔSlack௨͍ͨ͠ʯΛϋʔυίʔυͯ͠μϝ — ʮ͜ΕΫϦςΟΧϧʯ(Source)=>ʮΫϦςΟΧϧSlackʯ(sink)ͱ͍ͨ͠ — ͪΌΜͱؔ৺Λ͠Α͏ͳ -
༨ஊ — ࢲʮίϯϑΟάͬͯͱ͜ΖʹεοͱṖͷσϑΥϧτ͕ઃఆ͞Ε͍ͯͯɺͦΕ͕ਆͷ͓ݴ༿ ͔ͩΒௐ͍ͯ͠ͳ͍ɺͱ͍͏Α͏ͳݱͰDisk fullԿݟͨɻ࠷ѱʂʂʯ — ͪΌ·΄ΓʮͦΕLaravelΛͪΌΜͱ͑ͳ͍ਓ͕ѱ͍Ͱ͢Αʯ — Laravelϓϩͷ໊ݴͰ͢ —
ϩάنʹൺྫ͢Δ͠ɺͪΌΜͱઃఆ͢Δඞཁ͕͋ΓɺLaravelσϑΥϧτͩͱ monologΛ΄ͱΜͲௐڭͯ͠ͳ͍ͷͰΈͳ͞Μ͕ͪΌΜͱͯ͋͛͠Δඞཁ͕͋Δ͔Β Ͷʁʁʁ — (શ͍ͬͯ͘͡ͳ͍ͷʹແࣄͳͷɺଟτϥώοΫ͕ແ͍͔ΒͳͷͰɺૣΊʹରԠͯ͠ ͓͜͏ͳʂ) -
'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels'
=> ['single'], ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ], -
ϩάͷΑ͋͘Δ᠘ — ʮ͍ΕΕ͍ΕΔ΄Ͳ͍͔͚͍͢ʂʯ — => ͋Δҙຯͦ͏͕ͩɺϊΠζ͕૿͑Δ ϩά͕ࢹͱ࿈ܞ͢Δ͔Βʹ΄Ͳ΄Ͳ͕ྑ͍ ϩάϨϕϧͱΈ߹Θͤͯߟ͑ͯ — ʮϑΝαʔυελςΟοΫϝιουͰͲ͔͜ΒͰݺͯศརʂʯํࣜ
— => কདྷతʹ(େ)ͭΒ͍ͷͰɺςετϨΨγʔίʔυҎ֎ͰΊͨํ͕ྑ͍ (ςετͰϩάʁʁʁ) — ʮDIʁʯʮDIͰ࡞ΔϨϕϧͳΒ…͍…͔͠͠…ʯ — =>ϩΨʔ͕Ұຊ͔͠ͳͯ͘ྑ͍ͳΒྑ͍ͷͰ (ͪΖΜɺΕෳ࡞Δ͜ͱͰ͖ΔͩΖ͏ɺؾΛ͚͍ͭͯͬͯͬͯ͘Ε) -
ͱ͜ΖͰɺόονʁ — جຊಉ༷͕ͩɺͦͷ্ͰUNIXͷCLIϓϩάϥϜͷྲّྀʹͬऔΔ͖ — εςʔλείʔυΩνϯͱͤΑ — CronͷྲّྀʹଇΔͳͲ — ʮΤϥʔͰͳ͍ͳΒɺԿग़͞ͳ͍ʯ —
PHPͷΤϥʔϩάͷग़ྗઌΛϩάϑΝΠϧʹ͢Δͱը໘ʹͰͣɺؾ͔ͮͳ͍͜ͱ͕͋Δ ٯʹɺSTDERRʹͩ͢ͱɺϩάͷసૹ͕໘ͳ͜ͱ͋Δ — monologͷग़ྗϋϯυϥࣗ༝ʹελοΫͰ͖ΔͷͰศར — ϩάϑΝΠϧʹͩͭͭ͠ɺSTDERRʹग़͢ͱ͔Ͱ͖Δ — ͦͦʮCLIϓϩάϥϜʯͳͷ͔ͩΒɺPHPࣗମͰ͕ΜΒͳ͍ͷखɺී௨ͷCLIͱ ͯ͠ॻ͖ɺjournald(syslog+cron),fluentd()ͳͲͷΈ߹Θͤ -
ଈԠɺΞϥʔτ — ͙͢͞·֬ೝɾ͞ͳ͍ͱ͍͚ͳ͍Τϥʔ — લఏͱͯ͠ɺͩΕΤϥʔϩάΈͳ͍ͷͰ͋Δʂ(ਅإ) — ͕ۤདྷͯɺݟΔ — ͦΜͳ͜ͱͰΑ͍ͷͩΖ͏͔ɺ͍ɺΑ͘ͳ͍ͩΖ͏ —
ͭ·Γɺʮϩά͕དྷ͍ʯͷ࣌ — ϝʔϧ͢ΔɺSlackʹ͛ΔɺPagerDutyͱ͔͔ͭ͏ — ϩάϓϥοτϑΥʔϜmonologͷϋϯυϥΛ͏ — ݟͨ͋ͱɺΞΫγϣϯΛ͠·͠ΐ͏ — Կ͠ͳ͍ϩάͳΒফ͢ɻͰͳ͍ͱ͞ΒʹΑ·Εͳ͘ͳΔ -
࣌ܥྻɾ࣌ؒൣғͰݟΔϩά — ϩάϓϥοτϑΥʔϜΛ͔ͭ͏ͷ͕ఆ൪ — NඵؒʹMճΞϥʔτ͕͕͋ͬͨΒͲ͏ߟ͓͔͍͑ͯ͠ — ʮͨ·ͨ·ࣦഊ(ِཅੑ)ʯଟ͍ͷͰɺ࿈ଓNճͰʙͱ͍͏͕݅΄͍͠ࣄଟ͍ — ͕ɺηϧϑώʔϧ͢Δͷ௨͢Δඞཁͳ͍ —
NewRelicͩͱɺNRQLͳͲͰࣜΛఆٛͰ͖Δ => ݅ͷᮢΛ͑ͨ͜ΒΞϥʔτ — ࣗલͰ࡞ΔࣄͰ͖Δ͕ɺSaaSΛ͔ͭͬͨ΄͏͕ૣ͍ — FluentdͳͲϩάసૹͳͲͷઃఆ͕ඞཁ(ͳ߹) -
ͨΊͯɺੳ — ҟৗऴྃͷΤϥʔर͏ͷ͕؆୯ͩΖ͏(ग़ͳ͍ʁग़ͦ͏ʂ) — ʮਖ਼ৗऴྃ͠·͕ͨ͠ͳ͍ʯ͜ͱࢹͰ͖Δ͔ʁ — ʮ։࢝͠·ͨ͠ʯͱ͔ϩά͍Βͳ͘Ͷ͑ʁ͓ͬͯ͏(ओ؍)͚ͲɺͪΌΜͱಈ͍͍ͯΔ͔ Ͳ͏͔Γ͍ͨ(ຊؾͰͦ͏ࢥͬͯΔ)ͳΒඞཁ͔ — ͜͏͍͏ͷϩάϓϥοτϑΥʔϜΛΘͳ͍ͱࢹɾूܭͰ͖ͳ͍
— ࣮ߦ࣌ؒͱ͔ɺूܭͰ͖Εҙຯ͋ΔΑͶ — Ͱ͜ΕϊΠδʔʹͳΓ͕ͪɺϩάϨϕϧ͛͞Α͏ɻ -
·ͱΊ — ʮϩάɺԿ͔Λ͢ΔͨΊʯɺͦ͏͍͏ൃͰॻ͜͏ — ͱ͍ͬͯɺਓؒϩάΛݟͳ͍ͷͰʮϩά͕དྷ͍ʯͷ࣌ — ͦ͏͢Δͱɺ৭ʑͳͷ͕ੜ͖ͯ͘Δ — ϩΨʔղੳɺϩάཧπʔϧɺΞάϦήʔλΛ׆༻͢Δͱߴͳ͜ͱͰ͖Δ —
(࠷ѱɺmonolog͚ͩͰ৭ʑͰ͖Δ) — ྑ͍ϩάઃܭͯ͠ɺྑ͍ӡ༻͍ͯ͜͠͏ͳʂʂ