{"id":45231,"date":"2022-09-21T21:22:01","date_gmt":"2022-09-21T20:22:01","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=45231&#038;preview=true&#038;preview_id=45231"},"modified":"2023-08-24T11:30:30","modified_gmt":"2023-08-24T10:30:30","slug":"laravel-logning","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/","title":{"rendered":"Laravel-logning: Alt hvad du beh\u00f8ver at vide"},"content":{"rendered":"<p>N\u00e5r man udvikler en moderne applikation, b\u00f8r logning st\u00e5 \u00f8verst p\u00e5 prioriteringslisten.<\/p>\n<p>Logning giver mulighed for at visualisere din app i b\u00e5de udvikling og produktion, hvilket muligg\u00f8r gennemsigtighed og synlighed. Med korrekt struktureret logning kan moderne applikationer blive nemmere at vedligeholde, da vi proaktivt kan identificere fejlpunkter og performance-flaskehalse i vores app.<\/p>\n<p>Laravel-rammen leveres med et robust logningssystem, der h\u00e5ndterer alle de forhindringer, der er involveret i konfigurationen af et korrekt struktureret logningssystem ud af boksen. Dette nye logningssystem, der blev introduceret i Laravel 6.5, er kraftfuldt, og vi vil udforske det i denne artikel.<\/p>\n\n<p>Denne artikel vil udforske det grundl\u00e6ggende i Laravel-logning og hvorfor du b\u00f8r bruge Laravel-logning i dit n\u00e6ste projekt. Vi vil diskutere struktureret logning og centraliseret logning i detaljer. Derudover vil vi l\u00e6re hvordan man implementerer Laravel logning ved at bygge en Todo-applikation.<\/p>\n<p>Du vil f\u00e5 mere ud af denne artikel, hvis du allerede har har godt styr p\u00e5 f\u00f8lgende:<\/p>\n<ul>\n<li>Godt kendskab til webudvikling<\/li>\n<li>Grundl\u00e6ggende <a href=\"https:\/\/kinsta.com\/blog\/what-is-laravel\/\">forst\u00e5else af Laravel<\/a><\/li>\n<li>Opbygning af apps med Laravel<\/li>\n<\/ul>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Hvad er Laravel Logging?<\/h2>\n<p>Laravel logging handler om, hvordan Laravel h\u00e5ndterer logning eller automatisk problemrapportering ved hj\u00e6lp af et viralt PHP-logningssystem kaldet Monolog. Men p\u00e5 grund af Laravels filosofi om at bruge popul\u00e6re eksisterende biblioteker til at implementere forskellige framework-funktioner anvender Laravel Monolog til alle logningsbehov.<\/p>\n<p><a href=\"https:\/\/seldaek.github.io\/monolog\/\" target=\"_blank\" rel=\"noopener noreferrer\">Monolog<\/a> er et meget fleksibelt og popul\u00e6rt PHP-logbibliotek, som vi kan konfigurere til at sende dine logs til filer, sockets, databaser og andre webtjenester. Monolog giver en velkendt gr\u00e6nseflade til at skrive logs fra standard tekstfiler til avancerede logh\u00e5ndteringstjenester fra tredjeparter. Laravel konfigurerer typisk Monolog til at bruge en standardkonfigurationsfil til logning.<\/p>\n<p>For flere oplysninger om Monolog og dens funktioner skal du tjekke den <a href=\"https:\/\/seldaek.github.io\/monolog\/\" target=\"_blank\" rel=\"noopener noreferrer\">officielle dokumentation<\/a>, da det ligger uden for denne artikels r\u00e6kkevidde.<\/p>\n<p>F\u00f8r vi dykker ned i konfigurering og implementering af Laravel-logning ved hj\u00e6lp af Monolog, skal vi unders\u00f8ge flere grunde til at bruge Laravel-logning og de forskellige typer.<\/p>\n<h2>Hvorfor bruge Laravel-logning?<\/h2>\n<p>Hvorfor er logning n\u00f8dvendig?<\/p>\n<p><a href=\"https:\/\/12factor.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">Twelve-Factor App<\/a>-manifestet behandler logning som en af de kritiske bekymringer for en moderne applikation, da logning er en n\u00f8gle til ydeevne og overv\u00e5gning.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/docs\/wordpress-hosting\/wordpress-troubleshooting\/view-server-logs\/\">Logs<\/a> hj\u00e6lper med den detaljerede forst\u00e5else af fejl, der sker i produktionen, og hvor de stammer fra. Desuden kan logstrukturer med de rette logstrukturer vise den p\u00e5g\u00e6ldende bruger, den handling, der for\u00e5rsagede fejlen, og den mulige l\u00f8sning for hurtigere fejlrettelse og vedligeholdelse.<\/p>\n<p>Struktureret logning er en livredder i produktionsapplikationer ved at hj\u00e6lpe med at fejlfinde fejl og l\u00f8se problemer i produktionen. Derudover kan du overv\u00e5ge og indsamle alle dine logmeddelelser i realtid ved hj\u00e6lp af specialiserede logningsv\u00e6rkt\u00f8jer til live-analyse og rapportering.<\/p>\n<p>Af disse grunde skal du g\u00f8re struktureret logning til en topprioritet i dit n\u00e6ste moderne applikationsprojekt.<\/p>\n<p>Lad os se p\u00e5 oversigten over de forskellige logf\u00f8ringsstile, der er tilg\u00e6ngelige.<\/p>\n<h2>Grundl\u00e6ggende om Laravel-logning<\/h2>\n<p>Hvis du l\u00e6rer det grundl\u00e6ggende om logning, vil du forst\u00e5, hvordan Laravel h\u00e5ndterer logning, og hvordan du kan forbedre din strukturerede logningspraksis.<\/p>\n<p>Lad os unders\u00f8ge to v\u00e6sentlige koncepter inden for logning for bedre at forst\u00e5, hvordan vi skal implementere vores logningsprocedurer.<\/p>\n<h3>Laravel struktureret logning<\/h3>\n<p>Inden for softwareudvikling er struktureret logning implementering af et forudbestemt og konsistent beskedformat for programlogfiler. Dette format g\u00f8r det muligt at behandle meddelelserne som data, der kan overv\u00e5ges, manipuleres og visualiseres meget bedre end det almindelige tekstformat.<\/p>\n<p>Du skal implementere en struktureret logningstilgang i din moderne applikationsudvikling, fordi logfiler er v\u00e6sentlige aktiver for udviklerne, n\u00e5r der sker noget forkert med din applikation i produktionen.<\/p>\n<p>Da Laravel bruger Monolog, kan udviklere hurtigt implementere struktureret logning ved at konfigurere loggeren til at modtage bestemte typer oplysninger, gemme logfilerne i forskellige formater og sende logfilerne til forskellige logh\u00e5ndteringstjenester fra tredjeparter med henblik p\u00e5 visualisering.<\/p>\n<h3>Laravel centraliseret logning<\/h3>\n<p>Et centraliseret logningssystem er et system, hvor logs sendes til CLM-l\u00f8sninger (Centralized Log Management) fra flere kilder med henblik p\u00e5 nem konsolidering og visualisering. CLM er imidlertid en specialiseret log-l\u00f8sning, der indsamler logmeddelelser fra forskellige kilder og konsoliderer dataene for nem behandling og visualisering.<\/p>\n<p>Ud over dataindsamling forventes CLM ogs\u00e5 at underst\u00f8tte analysen af logdata og en klar pr\u00e6sentation af dataene efter analysen.<\/p>\n<h3>Struktureret logning vs. grundl\u00e6ggende logning<\/h3>\n<p>Lad os unders\u00f8ge forskellen mellem struktureret logning og grundl\u00e6ggende (ustruktureret) logning, og hvorfor du b\u00f8r bruge struktureret logning i dit Laravel-projekt.<\/p>\n<h4>Grundl\u00e6ggende logning<\/h4>\n<p>I grundl\u00e6ggende logning er logfilerne gemt i et r\u00e5t format med begr\u00e6nsede data til at foresp\u00f8rge og identificere individuelle logfiler.<\/p>\n<p>N\u00e5r du bruger Basic logging, vil <a href=\"https:\/\/kinsta.com\/dk\/\">udviklere<\/a> ikke kunne bruge tredjepartsanalysev\u00e6rkt\u00f8jer til at l\u00e6se, se og analysere logfiler, medmindre de udvikler et brugerdefineret v\u00e6rkt\u00f8j eller holder sig til et begr\u00e6nset v\u00e6rkt\u00f8j, der underst\u00f8tter deres logformat.<\/p>\n<p>Der er tre store grunde til at undg\u00e5 at bruge Basic logging:<\/p>\n<ol>\n<li>Centraliserede logh\u00e5ndteringssystemer kan ikke arbejde med dataene uden yderligere st\u00f8tte.<\/li>\n<li>En tilpasset l\u00f8sning er n\u00f8dvendig for at l\u00e6se og analysere dataene fra en grundl\u00e6ggende logningsl\u00f8sning.<\/li>\n<li>Det kan v\u00e6re en udfordring for administratorer at l\u00e6se grundl\u00e6ggende logningsdata, da de er r\u00e5 og ustrukturerede.<\/li>\n<\/ol>\n<h4>Struktureret logning<\/h4>\n<p>Struktureret logning sparer udviklere tid ved at bruge open source-v\u00e6rkt\u00f8jer til loganalyse fra tredjeparter, der underst\u00f8tter standard logstrukturer, til at l\u00e6se, se og analysere logfiler.<\/p>\n<p>Logfiler er nyttige, hvis de indeholder de korrekte data, der er anf\u00f8rt nedenfor, hvilket er det, som struktureret logning sigter mod at opn\u00e5. Vi kan bruge de data, der er indeholdt i struktureret logning, til at oprette dashboards, grafer, diagrammer og enhver anden nyttig visualisering til at bestemme applikationens tilstand.<\/p>\n<p>Dette er grundl\u00e6ggende eksempler p\u00e5 de oplysninger, som vi kan medtage i strukturerede logmeddelelser. Derudover kan du tilpasse dataene fuldst\u00e6ndigt til dine behov.<\/p>\n<p>Her er nogle eksempler p\u00e5 de data, du kan indsamle med struktureret logning:<\/p>\n<ol>\n<li>Den port, der anvendes til at udf\u00f8re funktionen<\/li>\n<li>Dato og klokkesl\u00e6t for den p\u00e5g\u00e6ldende h\u00e6ndelse<\/li>\n<li>Kundens brugernavn eller ID<\/li>\n<li>En beskrivelse af h\u00e6ndelsen (logmeddelelse)<\/li>\n<li>Den protokol, der blev brugt til at udf\u00f8re funktionen<\/li>\n<li>Placeringen af den udl\u00f8ste h\u00e6ndelse (angiv API eller k\u00f8rende app)<\/li>\n<li>Det unikke h\u00e6ndelses-id<\/li>\n<li>Den udl\u00f8ste handlingstype (logniveau)<\/li>\n<\/ol>\n<p>Logs skal indeholde nok data til, at det er nemt at visualisere l\u00f8sningen eller \u00e5rsagen til logh\u00e6ndelsen. Bem\u00e6rk ogs\u00e5, at du ikke b\u00f8r gemme alle typer oplysninger, f.eks. passwords eller f\u00f8lsomme data, i logfiler.<\/p>\n<p>Nu hvor vi har f\u00e5et et glimt af, hvad Laravel-logning handler om, skal vi g\u00e5 videre til at implementere Laravel-logning ved at bygge en applikation med logning som en f\u00f8rsteklasses borger.<\/p>\n<h2>S\u00e5dan implementeres Laravel-logning med Todo App<\/h2>\n<p>Nu skal vi anvende det, vi har l\u00e6rt indtil videre, ved at oprette et nyt Laravel-projekt og implementere Laravel-logning.<\/p>\n<p>Hvis du ikke har brugt Laravel f\u00f8r, kan du l\u00e6se <a href=\"https:\/\/kinsta.com\/blog\/what-is-laravel\/\">hvad Laravel er<\/a>, eller kigge p\u00e5 vores liste over <a href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-tutorial\/\">fremragende Laravel-tutorials<\/a> for at komme i gang.<\/p>\n<h3>Ops\u00e6tning af Laravel<\/h3>\n<p>F\u00f8rst skal vi oprette en frisk Laravel-instans ved hj\u00e6lp af nedenst\u00e5ende kommando. Du kan sl\u00e5 op i den <a href=\"https:\/\/laravel.com\/docs\/8.x\/installation\" target=\"_blank\" rel=\"noopener noreferrer\">officielle dokumentation<\/a> for mere.<\/p>\n<p>\u00c5bn din konsol og naviger til det sted, hvor du gemmer dine PHP-projekter, f\u00f8r du k\u00f8rer nedenst\u00e5ende kommandoer. S\u00f8rg for, at <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Composer<\/a> er installeret og konfigureret korrekt.<\/p>\n<pre><code class=\"language-json\">composer create-project laravel\/laravel laravel-logging-app\ncd laravel-logging-app \/\/ Change directory to current Laravel installation\nphp artisan serve \/\/ Start Laravel development server<\/code><\/pre>\n<h3>Konfigurering og seedning af databasen<\/h3>\n<p>Dern\u00e6st skal vi konfigurere vores database, oprette en ny <code>Todo<\/code> -model og seed 200 falske data til test.<\/p>\n<p>\u00c5bn din databaseklient, og opret en ny database. Vi g\u00f8r det samme med navnet <code>laravel_logging_app_db<\/code> og udfylder derefter vores <strong>.env<\/strong>-fil med databasens legitimationsoplysninger:<\/p>\n<pre><code class=\"language-bash\">DB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=laravel_logging_app_db\nDB_USERNAME=\/\/DB USERNAME HERE\nDB_PASSWORD=\/\/DB PASSWORD HERE<\/code><\/pre>\n<p>Derefter k\u00f8rer vi f\u00f8lgende kommando for at oprette migreringen og <code>Todo<\/code> -modellen samtidigt:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Todo -mc<\/code><\/pre>\n<p>\u00c5bn den nyligt oprettede migration fundet <strong>database\/migrations\/xxx-create-todos-xxx.php<\/strong> og inds\u00e6t f\u00f8lgende koder:<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse IlluminateSupportFacadesSchema;\nuse IlluminateDatabaseSchemaBlueprint;\nuse IlluminateDatabaseMigrationsMigration;\nclass CreateTodosTable extends Migration\n{\n  \/**\n  * Run the migrations.\n  *\n  * @return void\n  *\/\n  public function up()\n  {\n    Schema::create('todos', function (Blueprint $table) {\n      $table-&gt;id();\n      $table-&gt;string('title');\n      $table-&gt;text('description')-&gt;nullable();\n      $table-&gt;boolean('is_completed')-&gt;default(false);\n      $table-&gt;timestamps();\n    });\n  }\n  \/**\n  * Reverse the migrations.\n  *\n  * @return void\n  *\/\n  public function down()\n  {\n    Schema::dropIfExists('todos');\n  }\n}<\/code><\/pre>\n<p>Du kan s\u00e6tte dine todos med Faker-data ved at l\u00e6re <a href=\"https:\/\/laravel.com\/docs\/8.x\/seeding\" target=\"_blank\" rel=\"noopener noreferrer\">at s\u00e6tte dine databaser<\/a> i Laravel ved hj\u00e6lp af Faker.<\/p>\n<h3>Oversigt over Monolog<\/h3>\n<p>Med Laravel Monolog kan du streame og sende strukturerede logs til forskellige kanaler som f.eks. e-mails, Slack, filer, sockets, indbakker, databaser og forskellige webtjenester. I Laravel kan du konfigurere logning fra en enkelt konfigurationsfil, der ligger i <strong>config\/logging.php<\/strong>.<\/p>\n<p>Konfigurationsfilen leveres med foruddefinerede logdrivere at v\u00e6lge imellem, og standarddriveren er en <code>stack<\/code>, der bruger <code>single<\/code> -kanalen til at logge til en <strong>laravel.log<\/strong>-fil, der findes i mappen <strong>storage\/logs<\/strong>. Vi vil demonstrere struktureret logning ved at bruge et par af <a href=\"https:\/\/laravel.com\/docs\/8.x\/logging#available-channel-drivers\" target=\"_blank\" rel=\"noopener noreferrer\">Laravel-logdriverne<\/a>.<\/p>\n<p>Laravel tilbyder en <a href=\"https:\/\/laravel.com\/docs\/8.x\/logging#writing-log-messages\" target=\"_blank\" rel=\"noopener noreferrer\">h\u00e5ndfuld metoder<\/a> til at interagere med logs, som demonstreret generelt i <strong>TodosController.php<\/strong> controllerfilen om kort tid.<\/p>\n<h3>Skrivning af logmeddelelser i controlleren<\/h3>\n<p>\u00c5bn den nyligt oprettede <strong>TodosController.php<\/strong> controllerfil fundet <strong>app\/Http\/Controllers<\/strong> mappe og inds\u00e6t f\u00f8lgende koder:<\/p>\n<pre><code class=\"language-php\">\n&lt;?php\nnamespace AppHttpControllers;\nuse AppModelsTodo;\nuse IlluminateHttpRequest;\nuse AppHttpControllersController;\nuse IlluminateSupportFacadesAuth;\nuse IlluminateSupportFacadesLog;\nclass TodosController extends Controller\n{\n  public function index(Request $request)\n  {\n    $todos = Todo::all();\n    Log::warning('User is accessing all the Todos', ['user' =&gt; Auth::user()-&gt;id]);\n    return view('dashboard')-&gt;with(['todos' =&gt; $todos]);\n  }\n  public function byUserId(Request $request)\n  {\n    $todos = Todo::where('user_id', Auth::user()-&gt;id)-&gt;get();\n    Log::info('User is accessing all his todos', ['user' =&gt; Auth::user()-&gt;id]);\n    return view('dashboard')-&gt;with(['todos' =&gt; $todos]);\n  }\n  public function show(Request $request, $id)\n  {\n    $todo = Todo::find($id);\n    Log::info('User is accessing a single todo', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n    return view('show')-&gt;with(['todo' =&gt; $todo]);\n  }\n  public function update(Request $request, $id)\n  {\n    # Validations before updating\n    $todo = Todo::where('user_id', Auth::user()-&gt;id)-&gt;where('id', $id)-&gt;first();\n    Log::warning('Todo found for updating by user', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo]);\n    if ($todo) {\n      $todo-&gt;title = $request-&gt;title;\n      $todo-&gt;desc = $request-&gt;desc;\n      $todo-&gt;status = $request-&gt;status == 'on' ? 1 : 0;\n      if ($todo-&gt;save()) {\n        Log::info('Todo updated by user successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n        return view('show', ['todo' =&gt; $todo]);\n      }\n      Log::warning('Todo could not be updated caused by invalid todo data', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n      return; \/\/ 422\n    }\n    Log::error('Todo not found by user', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n    return; \/\/ 401\n  }\n  public function store(Request $request)\n  {\n    Log::warning('User is trying to create a single todo', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n    # Validations before updating\n    $todo = new Todo;\n    $todo-&gt;title = $request-&gt;title;\n    $todo-&gt;desc = $request-&gt;desc;\n    $todo-&gt;user_id = Auth::user()-&gt;id;\n    if ($todo-&gt;save()) {\n      Log::info('User create a single todo successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n      return view('show', ['todo' =&gt; $todo]);\n    }\n    Log::warning('Todo could not be created caused by invalid todo data', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n    return; \/\/ 422\n  }\n  public function delete(Request $request, $id)\n  {\n    Log::warning('User is trying to delete a single todo', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n    $todo = Todo::where('user_id', Auth::user()-&gt;id)-&gt;where('id', $id)-&gt;first();\n    if ($todo) {\n      Log::info('User deleted a single todo successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n      $todo-&gt;delete();\n      return view('index');\n    }\n    Log::error('Todo not found by user for deleting', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $id]);\n    return; \/\/ 404\n  }\n}<\/code><\/pre>\n<p>Inden for hver af metoderne i <code>TodoController<\/code>, tilf\u00f8jede vi <code>Log<\/code> facaden med et specifikt logniveau for at definere den type fejl, vi \u00f8nsker at sende. Nedenfor er et eksempel p\u00e5 brug af<\/p>\n<p>Log-facade i metoden <code>store<\/code>.<\/p>\n<pre><code class=\"language-php\">public function store(Request $request)\n{\n  Log::warning('User is trying to create a single todo', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n  # Validations before updating\n  $todo = new Todo;\n  $todo-&gt;title = $request-&gt;title;\n  $todo-&gt;desc = $request-&gt;desc;\n  $todo-&gt;user_id = Auth::user()-&gt;id;\n  if ($todo-&gt;save()) {\n    Log::info('User create a single todo successfully', ['user' =&gt; Auth::user()-&gt;id, 'todo' =&gt; $todo-&gt;id]);\n    return view('show', ['todo' =&gt; $todo]);\n  }\n  Log::warning('Todo could not be created caused by invalid todo data', ['user' =&gt; Auth::user()-&gt;id, 'data' =&gt; $request-&gt;except('password')]);\n  return; \/\/ 422\n}<\/code><\/pre>\n<h3>Formatering af logmeddelelser<\/h3>\n<p>Lad os antage, at du ikke er tilfreds med standard <code>LineFormatter<\/code>, som Laravel bruger, og som g\u00f8r et godt stykke arbejde med at give l\u00e6sbare og nyttige meddelelser.<\/p>\n<p>I s\u00e5 fald kan du nemt oprette et tilpasset formatterobjekt, der passer til dit brugsscenarie, og bruge det i hele programmet.<\/p>\n<p>Den officielle Monolog-dokumentation giver en komplet liste over <a href=\"https:\/\/github.com\/Seldaek\/monolog\/blob\/main\/doc\/02-handlers-formatters-processors.md#formatters\" target=\"_blank\" rel=\"noopener noreferrer\">tilg\u00e6ngelige formatters<\/a> og kan nemt oprette en tilpasset en.<\/p>\n<p>I Laravel kan du nemt indstille en af driverne til at bruge din brugerdefinerede formatter ved at tilf\u00f8je den til listen som nedenfor inde i konfigurationsfilen, der ligger p\u00e5 <strong>config\/logging.php<\/strong>:<\/p>\n<pre><code class=\"language-php\">'daily' =&gt; [\n  'driver' =&gt; 'daily',\n  'path' =&gt; storage_path('logs\/laravel.log'),\n  'level' =&gt; env('LOG_LEVEL', 'debug'),\n  'days' =&gt; 14,\n  'formatter' =&gt; MonologFormatterHtmlFormatter::class,\n  'formatter_with' =&gt; [\n    'dateFormat' =&gt; 'Y-m-d',\n  ]\n],<\/code><\/pre>\n<p>Eksemplet ovenfor tilf\u00f8jer en brugerdefineret <code>MonologFormatterHtmlFormatter<\/code> til <code>daily<\/code> -driveren ved hj\u00e6lp af <code>formatter<\/code> &#8211; og <code>formatter_with<\/code> -n\u00f8glen i <code>daily<\/code> -kanalkonfigurationen for at \u00e6ndre formatet af datoer.<\/p>\n<h3>Afsendelse af logs til forskellige kanaler<\/h3>\n<p>Ved hj\u00e6lp af Monolog kan Laravel sende logs til forskellige kanaler og flere kanaler samtidig.<\/p>\n<p>Lad os demonstrere, hvordan vi sender logs til vores Slack-kanal ved at f\u00f8lge disse enkle trin. \u00c6ndr standardlogkanalen til Slack, og tilf\u00f8j <a href=\"https:\/\/api.slack.com\/messaging\/webhooks\" target=\"_blank\" rel=\"noopener noreferrer\">Slack Webhook<\/a> URL i din <strong>.env<\/strong>-fil.<\/p>\n<pre><code class=\"markdown\">LOG_CHANNEL=slack\nLOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here<\/code><\/pre>\n<p>Test derefter din konfiguration ved at logge en meddelelse i din applikation ved hj\u00e6lp af <code>Log<\/code> -facaden som vist nedenfor:<\/p>\n<pre><code class=\"markdown\">Log::debug(\"The API instance is on fire caused by:\", ['user' =&gt; 1])<\/code><\/pre>\n<p>Du kan \u00e5bne din Slack-kanal for at kontrollere, om fejlen er udskrevet i den \u00f8nskede kanal, som du har angivet, da du genererede webhook-URL&#8217;en.<\/p>\n<h2>Opsummering<\/h2>\n<p>Logning er lige s\u00e5 vigtig som enhver anden faktor i din applikation, hvis ikke vigtigere. Derfor foresl\u00e5s det af Twelve-Factor App-manifestet som en af de mest kritiske bekymringer for enhver moderne applikation.<\/p>\n<p>Med effektiv logning kan du nemt l\u00e6se, se og visualisere fejl og defekter, der opst\u00e5r i din produktionsklare applikation. Derfor er det vigtigt, at du implementerer struktureret logning i din applikation lige fra starten af projektet.<\/p>\n\n<p>I denne artikel har vi udforsket Laravel logging, og hvorfor du b\u00f8r bruge det i dit n\u00e6ste projekt. Vi diskuterede b\u00e5de struktureret logning og centraliseret logning i detaljer. Derudover l\u00e6rte vi, hvordan man implementerer Laravel-logning ved at bygge en Todo-applikation.<\/p>\n<p>Hvordan har du planer om at implementere logning i din n\u00e6ste app? Lad os vide det i kommentarfeltet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00e5r man udvikler en moderne applikation, b\u00f8r logning st\u00e5 \u00f8verst p\u00e5 prioriteringslisten. Logning giver mulighed for at visualisere din app i b\u00e5de udvikling og produktion, hvilket &#8230;<\/p>\n","protected":false},"author":193,"featured_media":45232,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[285,507,508,238,39],"topic":[712,724],"class_list":["post-45231","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-laravel","tag-logging","tag-monitoring","tag-performance","tag-php","topic-laravel","topic-php-frameworks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Laravel-logning: Alt hvad du beh\u00f8ver at vide<\/title>\n<meta name=\"description\" content=\"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Laravel-logning: Alt hvad du beh\u00f8ver at vide\" \/>\n<meta property=\"og:description\" content=\"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-21T20:22:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:30:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Solomon Eseme\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png\" \/>\n<meta name=\"twitter:creator\" content=\"@kaperskyguru\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Solomon Eseme\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\"},\"author\":{\"name\":\"Solomon Eseme\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\"},\"headline\":\"Laravel-logning: Alt hvad du beh\u00f8ver at vide\",\"datePublished\":\"2022-09-21T20:22:01+00:00\",\"dateModified\":\"2023-08-24T10:30:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\"},\"wordCount\":1961,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png\",\"keywords\":[\"laravel\",\"logging\",\"monitoring\",\"performance\",\"php\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\",\"name\":\"Laravel-logning: Alt hvad du beh\u00f8ver at vide\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png\",\"datePublished\":\"2022-09-21T20:22:01+00:00\",\"dateModified\":\"2023-08-24T10:30:30+00:00\",\"description\":\"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Laravel-logning: Alt hvad du beh\u00f8ver at vide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2\",\"name\":\"Solomon Eseme\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g\",\"caption\":\"Solomon Eseme\"},\"description\":\"I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me\",\"sameAs\":[\"https:\/\/masteringbackend.com\",\"https:\/\/linkedin.com\/in\/solomoneseme\",\"https:\/\/x.com\/kaperskyguru\"],\"url\":\"https:\/\/kinsta.com\/dk\/blog\/author\/solomoneseme\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Laravel-logning: Alt hvad du beh\u00f8ver at vide","description":"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/","og_locale":"da_DK","og_type":"article","og_title":"Laravel-logning: Alt hvad du beh\u00f8ver at vide","og_description":"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.","og_url":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2022-09-21T20:22:01+00:00","article_modified_time":"2023-08-24T10:30:30+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png","type":"image\/png"}],"author":"Solomon Eseme","twitter_card":"summary_large_image","twitter_description":"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png","twitter_creator":"@kaperskyguru","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Solomon Eseme","Estimeret l\u00e6setid":"11 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/"},"author":{"name":"Solomon Eseme","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2"},"headline":"Laravel-logning: Alt hvad du beh\u00f8ver at vide","datePublished":"2022-09-21T20:22:01+00:00","dateModified":"2023-08-24T10:30:30+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/"},"wordCount":1961,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png","keywords":["laravel","logging","monitoring","performance","php"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/","url":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/","name":"Laravel-logning: Alt hvad du beh\u00f8ver at vide","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png","datePublished":"2022-09-21T20:22:01+00:00","dateModified":"2023-08-24T10:30:30+00:00","description":"Logning er afg\u00f8rende for at overv\u00e5ge sundheden og effektiviteten af dine udviklingsprojekter. L\u00e6r, hvordan du anvender struktureret logning i Laravel.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/laravel-logging.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-logning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/dk\/emner\/laravel\/"},{"@type":"ListItem","position":3,"name":"Laravel-logning: Alt hvad du beh\u00f8ver at vide"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/51c9c77fa35cf1ef9a46308358441ab2","name":"Solomon Eseme","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1c701993f8ff8c8df2a4c5664834a4e5?s=96&d=mm&r=g","caption":"Solomon Eseme"},"description":"I am a Software Engineer and Content Creator who is geared toward building high-performing and innovative products following best practices and industry standards. I also love writing about it at Masteringbackend.com. Follow me on Twitter, LinkedIn, and About Me","sameAs":["https:\/\/masteringbackend.com","https:\/\/linkedin.com\/in\/solomoneseme","https:\/\/x.com\/kaperskyguru"],"url":"https:\/\/kinsta.com\/dk\/blog\/author\/solomoneseme\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=45231"}],"version-history":[{"count":10,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45231\/revisions"}],"predecessor-version":[{"id":45507,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45231\/revisions\/45507"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/en"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/jp"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/es"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/translations\/se"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45231\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/45232"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=45231"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=45231"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=45231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}