Source Metadata
Source Metadata is data attached to log entries that represent metadata regarding where the log occurred.
This data can be useful for better error tracing, or supporting certain features.
- What source metadata is
- How source metadata is attached to logs
- The different components of source metadata
Overview
At its core, source metadata is just a simple type.
export type SourceMetadata = {
function_name?: string;
nearest_function_name?: string;
file_path: string;
line_number: number;
};
You can find this type on log entries under the source_metadata property.
export type LogEntry = {
level: LogLevel;
message: string;
data: LogData;
encoded_data: LogData;
config: Writable<RLogConfig>;
context?: LogContext;
timestamp: number;
source_metadata: SourceMetadata;
};
Function Name
The function_name property of source metadata contains the name of the function where the log occurred.
This may be undefined if the log occurred in an anonymous function.
import { rLog } from "@rbxts/rlog";
const logger = new rLog({
enrichers: [
(entry) => {
entry.message = entry.source_metadata.function_name;
return entry;
},
],
});
function GivePlayerMoney() {
logger.i("Where am I?");
}
GivePlayerMoney();
Nearest Function Name
If the instance was created in an anonymous function, it won't have a name. Even if the outer scope was a named function.
To solve this, you can use the nearest_function_name property instead.
If the function does have a name though, nearest_function_name will point to the same thing as function_name.
If you somehow have a stack full of anonymous functions, it's possible for nearest_function_name to be undefined as
well.
import { rLog } from "@rbxts/rlog";
const logger = new rLog({
enrichers: [
(entry) => {
entry.message = entry.source_metadata.nearest_function_name;
return entry;
},
],
});
function GivePlayerMoney() {
const doStuff = () => {
logger.i("Where am I?");
};
doStuff();
}
GivePlayerMoney();
Notice how it says GivePlayerMoney instead of doStuff? This is because doStuff is not a named function. It's a
variable that points to an anonymous function.*
File Path
The file_path property of source metadata contains the full path to the file where the log occurred.
import { rLog } from "@rbxts/rlog";
const logger = new rLog({
enrichers: [
(entry) => {
entry.message = entry.source_metadata.file_path;
return entry;
},
],
});
function GivePlayerMoney() {
logger.i("Where am I?");
}
GivePlayerMoney();
Line Number
The line_number property of source metadata contains the line in the file where the log occurred.
For example purposes, we're using the TS line number, but it's actually the line number in the transpiled luau code.
import { rLog } from "@rbxts/rlog";
const logger = new rLog({
enrichers: [
(entry) => {
entry.message = `${entry.source_metadata.line_number}`;
return entry;
},
],
});
function GivePlayerMoney() {
logger.i("Where am I?");
}
GivePlayerMoney();
Summary
Let's recap what we've learned about source metadata:
- It contains data pertaining to where the log occurred.
- You can use nearest_function_name when dealing with anonymous functions.
- nearest_function_name can still be
undefinedin certain situations. - The line_number is the file line number in the transpiled luau, not the TS source.