Bird
Raised Fist0
Nginxdevops~10 mins

Conditional logging in Nginx - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Process Flow - Conditional logging
Request Received
Evaluate Condition
Log Request
Send Response
Nginx checks a condition for each request. If true, it logs the request; if false, it skips logging.
Execution Sample
Nginx
map $request_uri $loggable {
    default 1;
    ~^/health 0;
}

access_log /var/log/nginx/access.log combined if=$loggable;
This config logs all requests except those starting with /health.
Process Table
StepRequest URICondition ($loggable)ActionLog Output
1/index.html1 (true)Log requestLogged /index.html
2/health0 (false)Skip loggingNo log
3/api/data1 (true)Log requestLogged /api/data
4/health/status0 (false)Skip loggingNo log
5/about1 (true)Log requestLogged /about
6End of requests---
💡 All requests processed; logging done only if condition is true.
Status Tracker
VariableStartAfter 1After 2After 3After 4After 5Final
$request_uri-/index.html/health/api/data/health/status/about-
$loggable-10101-
Key Moments - 2 Insights
Why does /health not get logged even though it is a valid request?
Because the condition $loggable is set to 0 for URIs starting with /health, as shown in rows 2 and 4 of the execution_table, so logging is skipped.
What does the 'if=$loggable' part do in the access_log directive?
It tells nginx to log the request only if $loggable is true (1). This is why requests with $loggable=0 are not logged, as seen in the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of $loggable for the request '/api/data'?
A0
B-
C1
DUndefined
💡 Hint
Check row 3 under the 'Condition ($loggable)' column in the execution_table.
At which step does the logging condition evaluate to false?
AStep 2
BStep 3
CStep 1
DStep 5
💡 Hint
Look for rows where 'Condition ($loggable)' is 0 in the execution_table.
If we remove the line '~^/health 0;' from the map block, what happens to logging for '/health' requests?
AThey will still not be logged
BThey will be logged
CLogging will stop for all requests
DNginx will error
💡 Hint
Refer to how the map sets default to 1 and the effect of the regex line in the variable_tracker.
Concept Snapshot
Conditional logging in nginx uses variables and the 'if' parameter in access_log.
Use 'map' to set a variable based on request properties.
Set 'if=$variable' in access_log to log only when variable is true.
Example: skip logging health checks by setting variable to 0 for /health URIs.
This reduces log noise and improves log relevance.
Full Transcript
In nginx, conditional logging lets you decide which requests to log based on a condition. We use the 'map' directive to create a variable, here called $loggable, which is 1 for most requests but 0 for those starting with /health. Then, in the access_log directive, we add 'if=$loggable' so nginx logs only when $loggable is true. The execution table shows requests with /health are skipped from logging because their $loggable is 0. This helps keep logs clean by ignoring routine health checks. Beginners often wonder why some requests are not logged; it's because the condition variable controls logging. Removing the regex line in the map would cause all requests to be logged, including /health. This method is simple and effective for controlling nginx logs.

Practice

(1/5)
1. What is the main purpose of conditional logging in nginx?
easy
A. To log only specific requests based on conditions
B. To disable all logging permanently
C. To log every request without any filter
D. To log errors only, ignoring access logs

Solution

  1. Step 1: Understand logging basics in nginx

    Logging records requests to help monitor and debug web traffic.
  2. Step 2: Identify the role of conditional logging

    Conditional logging allows filtering which requests get logged based on rules.
  3. Final Answer:

    To log only specific requests based on conditions -> Option A
  4. Quick Check:

    Conditional logging = selective logging [OK]
Hint: Conditional logging means logging only some requests [OK]
Common Mistakes:
  • Thinking conditional logging disables all logs
  • Confusing conditional logging with error-only logging
  • Assuming it logs every request without filtering
2. Which of the following is the correct syntax to enable conditional logging in nginx using the access_log directive?
easy
A. access_log /var/log/nginx/access.log on_condition=$if;
B. access_log /var/log/nginx/access.log if=$condition;
C. access_log /var/log/nginx/access.log condition=$if;
D. access_log if=$condition /var/log/nginx/access.log;

Solution

  1. Step 1: Recall the correct order of parameters in access_log

    The syntax is: access_log <path> [format] [if=condition];
  2. Step 2: Identify the correct use of the if= option

    The condition must be specified as if=$variable after the log path.
  3. Final Answer:

    access_log /var/log/nginx/access.log if=$condition; -> Option B
  4. Quick Check:

    access_log path if=condition [OK]
Hint: Remember: if= comes after log file path in access_log [OK]
Common Mistakes:
  • Placing if= before the log file path
  • Using wrong parameter names like condition= or on_condition=
  • Omitting the $ sign before the variable
3. Given the following nginx configuration snippet, what will be the effect on logging?
map $request_uri $loggable {
    default 1;
    "/health" 0;
}

access_log /var/log/nginx/access.log combined if=$loggable;
medium
A. Only requests to /health will be logged
B. No requests will be logged
C. All requests except to /health will be logged
D. All requests will be logged regardless of URI

Solution

  1. Step 1: Understand the map directive

    The map sets $loggable to 0 for "/health" and 1 for all others.
  2. Step 2: Analyze the access_log condition

    Logging happens only if $loggable is true (1), so requests to "/health" (0) are skipped.
  3. Final Answer:

    All requests except to /health will be logged -> Option C
  4. Quick Check:

    map 0 disables logging for /health [OK]
Hint: map 0 disables logging; 1 enables it [OK]
Common Mistakes:
  • Assuming /health requests are logged
  • Thinking map disables all logging
  • Confusing default and specific URI values
4. Identify the error in this nginx configuration for conditional logging:
map $status $loggable {
    200 1;
    default 0;
}

access_log /var/log/nginx/access.log combined if=loggable;
medium
A. access_log path is invalid
B. map directive syntax is incorrect
C. Cannot use $status variable in map
D. Missing $ before loggable in access_log condition

Solution

  1. Step 1: Check variable usage in access_log

    Variables must be prefixed with $ in conditions, so if=loggable is wrong.
  2. Step 2: Confirm correct syntax

    Correct syntax is if=$loggable to reference the variable properly.
  3. Final Answer:

    Missing $ before loggable in access_log condition -> Option D
  4. Quick Check:

    Variables need $ prefix in if= [OK]
Hint: Always prefix variables with $ in if= conditions [OK]
Common Mistakes:
  • Omitting $ before variable in if= condition
  • Miswriting map syntax
  • Assuming $status cannot be used in map
5. You want to log all requests except those with user agent containing "Googlebot". Which configuration correctly implements this conditional logging?
hard
A. map $http_user_agent $loggable { default 1; ~Googlebot 0; } access_log /var/log/nginx/access.log combined if=$loggable;
B. map $http_user_agent $loggable { default 0; ~Googlebot 1; } access_log /var/log/nginx/access.log combined if=$loggable;
C. map $http_user_agent $loggable { default 1; Googlebot 0; } access_log /var/log/nginx/access.log combined if=$loggable;
D. map $http_user_agent $loggable { default 1; ~Googlebot 1; } access_log /var/log/nginx/access.log combined if=$loggable;

Solution

  1. Step 1: Use map with regex to detect "Googlebot" in user agent

    The ~ prefix allows regex matching; setting 0 disables logging for matching agents.
  2. Step 2: Set default to 1 to log all other requests

    Default 1 means log unless user agent matches Googlebot.
  3. Step 3: Use if=$loggable in access_log to apply condition

    This ensures only requests with $loggable=1 are logged.
  4. Final Answer:

    map $http_user_agent $loggable { default 1; ~Googlebot 0; } access_log /var/log/nginx/access.log combined if=$loggable; -> Option A
  5. Quick Check:

    Regex ~Googlebot disables logging for bots [OK]
Hint: Use ~ for regex in map to match user agents [OK]
Common Mistakes:
  • Using exact string without ~ for regex
  • Reversing default values causing wrong logging
  • Not prefixing variable with $ in if= condition