You can combine triggers and method generators into trigger generators like this:

Class User.Class1 Extends %Persistent
{

Property prop1 As %String;

Property prop2 As %String;

Trigger NewTrigger [ CodeMode = objectgenerator, Event = INSERT, Time = AFTER ]
{
    #dim class As %Dictionary.CompiledClass = %compiledclass
    set proplist = ""
    for i=1:1:class.Properties.Count() {
        #dim prop As %Dictionary.CompiledProperty = class.Properties.GetAt(i)
        if prop.Internal || prop.Calculated || prop.ReadOnly || prop.Private || prop.Identity || prop.MultiDimensional continue
        set proplist = proplist _ $lb(prop.Name)
    }
    
    do %code.WriteLine($$$TAB _ "set ^dbg($i(^dbg)) = $lb({" _$lts(proplist, "},{") _ "})")
    quit $$$OK
}

/// do ##class(User.Class1).Test()
ClassMethod Test()
{
    do ..%KillExtent()
    kill ^dbg
    
    &sql(INSERT INTO Class1 (prop1, prop2) Values ('Alice', 1))
    &sql(INSERT INTO Class1 (prop1, prop2) Values ('Bob'  , 2))
    zw ^dbg
}

Test:

do ##class(User.Class1).Test()
^dbg=2
^dbg(1)=$lb("Alice",1)
^dbg(2)=$lb("Bob",2)

Here's whats going on during compilation.

  1. Build list of all relevant properties and write them into proplist variable. 
  2. Generate trigger code:  set ^dbg($i(^dbg)) = $lb({prop1}, {prop2})

And at runtime only set ^dbg gets hit

That said I'd have automatically generated some log class and called method log there, passing all properties.

Some docs:

Just redefine the trigger with the same name in a child class:

Class FormsDev.NewClass1 Extends %Persistent
{

Property Name As %String;

Trigger Insert [ Event = INSERT ]
{
    Set ^dbg = {Name}
}

/// do ##class(FormsDev.NewClass1).Test()
ClassMethod Test()
{
    Kill ^FormsDev.NewClass1D, ^dbg, ^dbg2
    
    &sql(INSERT INTO FormsDev.NewClass1 (Name) Values ('Alice'))
    &sql(INSERT INTO FormsDev.NewClass2 (Name) Values ('Bob'))
    zw ^dbg, ^dbg2
}

}

and child class:

Class FormsDev.NewClass2 Extends FormsDev.NewClass1
{

Trigger Insert [ Event = INSERT ]
{
    Set ^dbg2 = {Name}
}

}

Test:

>do ##class(FormsDev.NewClass1).Test()
^dbg="Alice"
^dbg2="Bob"

 

Also, if you change trigger name, both would be executed. For example Insert in NewClass1:

Trigger Insert [ Event = INSERT ]
{
    Set ^dbg($i(^dbg)) = {Name}
}

And Insert2 in NewClass2:

Trigger Insert2 [ Event = INSERT ]
{
    Set ^dbg2($i(^dbg2)) = {Name}
}

Would result in:

>do ##class(FormsDev.NewClass1).Test()
^dbg=2
^dbg(1)="Alice"
^dbg(2)="Bob"
^dbg2=1
^dbg2(1)="Bob"