Creating Logs from Unity – For Data Analysis

Error & Exceptions Logging:

1. Exception Handling:

Importance: Exception handling is vital for robust software. It provides insights into unexpected events, enabling proactive identification and resolution of issues that disrupt normal program flow.

Implementation: Use try-catch blocks to capture exceptions. Log relevant details like the error message, stack trace, and context to aid in debugging.

Example:

try

{

    // Code that may throw an exception

}

catch (Exception ex)

{

    // Log the exception details

    LogException(ex);

}

2. Failed Validations:

Importance: Logging failed validations helps in understanding and identifying incorrect data formats or unacceptable values early in the processing, ensuring data integrity.

Implementation: Log details of failed validations, including the input data and the reason for failure.

Example:

if (!IsValidDataFormat(inputData))

{

    // Log the failed validation

    LogError(“Invalid data format for input: ” + inputData);

}

3. Critical Failures:

Importance: Logging critical failures is essential as it provides immediate visibility into severe issues that significantly impact application functionality and user experience.

Implementation: Log details of critical failures, including the impacted functionality and any additional context for debugging.

Example:

if (criticalFunction() == null)

{

    // Log the critical failure

    LogError(“Critical function failed: ” + criticalFunctionName);

}

4. Security Breaches:

Importance: Logging security-related errors or unauthorized access attempts is crucial for identifying and responding to potential security threats promptly.

Implementation: Log security-related events, such as failed authentication attempts, unauthorized access, or suspicious activities.

Example:

if (!IsAuthorized(user))

{

    // Log the unauthorized access attempt

    LogError(“Unauthorized access attempt by user: ” + user);

}

Info Logging

1. User Actions:

Why Log User Actions?

Understanding how users interact with the game is essential for improving user experience, identifying popular features, and optimizing game mechanics.

How to Log User Actions:

Create log entries for significant user actions, capturing details like the action type, relevant game state, and user identifier.

Example:

{

  “logs”: [

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T13:45:00Z”,

      “device_id”: “ABC456”,

      “action_type”: “LevelCompleted”,

      “user_id”: “user123”,

      “game_state”: “Level 3”

    },

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T14:30:00Z”,

      “device_id”: “DEF789”,

      “action_type”: “ItemPurchased”,

      “user_id”: “user456”,

      “game_state”: “InGameShop”

    }

  ]

}

Space Ninja Example:

{

  “logs”: [

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T13:45:00Z”,

      “action_type”: “Game Over”,

      “user_name”: “Bluboy123”,

      “game_score”: “1520”

    },

    {

       “type”: “info”,

      “timestamp”: “2023-10-11T13:50:00Z”,

      “action_type”: “New High Score Achieved”,

      “user_name”: “Bluboy123”,

      “game_score”: “2500”

    }

  ]

}

2. System Startup/Shut Down:

Why Log System Startup/Shut Down?

Monitoring the system/application lifecycle helps in understanding performance patterns and potential issues during startup or shutdown.

How to Log System Startup/Shut Down:

Create log entries indicating system startup and shutdown, including relevant details like startup time and shutdown reason.

Example:

{

  “logs”: [

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T12:00:00Z”,

      “startup_time”: “12.5s”,

      “message”: “Game started successfully.”

    },

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T23:45:00Z”,

      “shutdown_reason”: “User exited the game.”,

      “message”: “Game closed.”

    }

  ]

}

3. External Integrations:

Why Log External Integrations?

Logging interactions with external systems or APIs is vital for diagnosing integration problems, monitoring performance, and ensuring data consistency.

How to Log External Integrations:

Create log entries for each interaction with external systems, recording details like API endpoint and response.

Example:

{

  “logs”: [

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T15:00:00Z”,

      “androidFunctionCalled”: “gameStart”,

      “response message”: “Score sent to server successfully.”

    },

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T16:30:00Z”,

      “androidFunctionCalled”: “updateScore”,

      “message”: “No score received.”

    }

  ]

}

4. Configuration Changes:

Why Log Configuration Changes?

Logging configuration changes helps in tracking modifications, understanding system behavior, and identifying potential issues related to configurations.

How to Log Configuration Changes:

Create log entries whenever there’s a configuration change, including details like the changed configuration parameter and its new value.

Example:

{

  “logs”: [

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T17:00:00Z”,

      “config_change”: “DifficultyLevel”,

      “new_value”: “Medium”,

      “message”: “Difficulty level changed to Medium.”

    },

    {

      “type”: “info”,

      “timestamp”: “2023-10-11T18:45:00Z”,

      “config_change”: “SoundButton”,

      “new_value”: “Off”,

      “message”: “Sound button is turned off”

    }

  ]

}

General Best Practices for Info Logging:

  • Structured Data: Use a clear and consistent structure for logged data to enable easy parsing and analysis.
  • Relevant Details: Include only relevant information in the log entries to keep the log files concise and useful.
  • Timestamps: Always include timestamps to track when events occurred.
  • Granularity: Log at an appropriate level of granularity to ensure useful insights without overwhelming the logs.

Debug Logging

1. Function Entry/Exit:

Why Log Function Entry/Exit?

Understanding the flow of functions is crucial for identifying issues, optimizing code, and improving the overall performance of the game.

How to Log Function Entry/Exit:

Create log entries at the beginning and end of important functions to log entry and exit points.

Example:

{

  “logs”: [

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T12:00:00Z”,

      “device_id”: “ABC123”,

      “message”: “Entering function: LoadLevel”

    },

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T12:05:00Z”,

      “device_id”: “ABC123”,

      “message”: “Exiting function: LoadLevel”

    }

  ]

}

2. Intermediate Values:

Why Log Intermediate Values?

Logging intermediate values during critical operations helps in diagnosing data-related issues and understanding the program’s behavior.

How to Log Intermediate Values:

Create log entries to capture intermediate variable values during critical operations.

Example:

{

  “logs”: [

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T14:00:00Z”,

      “device_id”: “DEF456”,

      “message”: “Intermediate Value: x = 42”

    },

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T14:05:00Z”,

      “device_id”: “DEF456”,

      “message”: “Intermediate Value: y = 15”

    }

  ]

}

3. Algorithm Steps:

Why Log Algorithm Steps?

Logging important steps and decisions in algorithms facilitates a deeper understanding of the game’s logic and aids in debugging.

How to Log Algorithm Steps:

Create log entries to record critical steps and decisions within the game’s algorithms.

Example:

{

  “logs”: [

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T15:00:00Z”,

      “device_id”: “GHI789”,

      “message”: “Algorithm Step: Initializing game data”

    },

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T15:15:00Z”,

      “device_id”: “GHI789”,

      “message”: “Algorithm Step: Calculating player score”

    }

  ]

}

4. Verbose Information:

Why Log Verbose Information?

Logging detailed information about the application’s state, behavior, and internal processes is crucial for comprehensive debugging and optimization.

How to Log Verbose Information:

Create log entries with detailed verbose information, capturing application state and behavior.

Example:

{

  “logs”: [

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T16:00:00Z”,

      “device_id”: “JKL789”,

      “message”: “Verbose Info: Player position – (x: 10, y: 15)”

    },

    {

      “type”: “debug”,

      “timestamp”: “2023-10-11T16:30:00Z”,

      “device_id”: “JKL789”,

      “message”: “Verbose Info: Game state – Running”

    }

  ]

}

General Best Practices for Debug Logging:

  • Granular Logging: Log at an appropriate level of granularity to capture the necessary details for debugging without overwhelming the logs.
  • Selective Usage: Use debug logs selectively to avoid cluttering production logs while ensuring vital debugging information is captured during development and testing.
  • Consistency: Maintain a consistent log message format and structure for ease of analysis and interpretation.

Trace Logging

1. Detailed Tracing:

Why Use Detailed Tracing?

Detailed tracing is essential for providing a comprehensive view of the game’s critical processes or modules, aiding in understanding intricate behaviors and optimizing those areas.

How to Use Detailed Tracing:

Log detailed traces of every significant step or action within critical processes or modules to provide in-depth insights.

Example:

{

  “logs”: [

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T14:00:00Z”,

      “device_id”: “ABC123”,

      “message”: “Detailed Trace: Initializing game data”

    },

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T14:05:00Z”,

      “device_id”: “DEF456”,

      “message”: “Detailed Trace: Loading game assets”

    }

  ]

}

2. Performance Metrics:

Why Log Performance Metrics?

Logging performance metrics, including execution times, memory usage, and resource utilization, is crucial for identifying performance bottlenecks and optimizing the game.

How to Log Performance Metrics:

Record performance-related metrics like execution times, memory usage, and other resource utilization information.

Example:

{

  “logs”: [

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T15:00:00Z”,

      “device_id”: “GHI789”,

      “message”: “Performance Metric: Execution Time – 25ms”

    },

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T15:15:00Z”,

      “device_id”: “JKL012”,

      “message”: “Performance Metric: Memory Usage – 150MB”

    }

  ]

}

3. Low-Level Debugging:

Why Use Low-Level Debugging?

Logging extremely detailed information, such as variable values, method calls, or low-level system operations, is vital for thorough debugging and analysis.

How to Use Low-Level Debugging:

Log detailed information like variable values, method calls, or any low-level system operations for precise debugging and analysis.

Example:

{

  “logs”: [

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T16:00:00Z”,

      “device_id”: “MNO345”,

      “message”: “Low-Level Debug: Method XYZ() called with parameters (x: 10, y: 15)”

    },

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T16:30:00Z”,

      “device_id”: “PQR678”,

      “message”: “Low-Level Debug: Variable ‘playerPosition’ updated to (x: 20, y: 25)”

    }

  ]

}

3. Low-Level Debugging:

Why Use Low-Level Debugging?

Logging extremely detailed information, such as variable values, method calls, or low-level system operations, is vital for thorough debugging and analysis.

How to Use Low-Level Debugging:

Log detailed information like variable values, method calls, or any low-level system operations for precise debugging and analysis.

Example:

{

  “logs”: [

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T16:00:00Z”,

      “device_id”: “MNO345”,

      “message”: “Low-Level Debug: Method XYZ() called with parameters (x: 10, y: 15)”

    },

    {

      “type”: “trace”,

      “timestamp”: “2023-10-11T16:30:00Z”,

      “device_id”: “PQR678”,

      “message”: “Low-Level Debug: Variable ‘playerPosition’ updated to (x: 20, y: 25)”

    }

  ]

}